github.com/aliyun/credentials-go@v1.4.7/README-CN.md (about)

     1  [English](README.md) | 简体中文
     2  
     3  # Alibaba Cloud Credentials for Go
     4  
     5  [![Latest Stable Version](https://badge.fury.io/gh/aliyun%2Fcredentials-go.svg)](https://badge.fury.io/gh/aliyun%2Fcredentials-go)
     6  [![Go](https://github.com/aliyun/credentials-go/actions/workflows/go.yml/badge.svg)](https://github.com/aliyun/credentials-go/actions/workflows/go.yml)
     7  [![codecov](https://codecov.io/gh/aliyun/credentials-go/branch/master/graph/badge.svg)](https://codecov.io/gh/aliyun/credentials-go)
     8  [![License](https://poser.pugx.org/alibabacloud/credentials/license)](https://packagist.org/packages/alibabacloud/credentials)
     9  [![Go Report Card](https://goreportcard.com/badge/github.com/aliyun/credentials-go)](https://goreportcard.com/report/github.com/aliyun/credentials-go)
    10  [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/aliyun/credentials-go/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/aliyun/credentials-go/?branch=master)
    11  
    12  ![Alibaba Cloud Logo](https://aliyunsdk-pages.alicdn.com/icons/AlibabaCloud.svg)
    13  
    14  Alibaba Cloud Credentials for Go 是帮助 GO 开发者管理凭据的工具。
    15  
    16  本文将介绍如何获取和使用 Alibaba Cloud Credentials for Go。
    17  
    18  ## 要求
    19  
    20  - 请确保你的系统安装了 1.12.x 或更新版本的 Go 环境。
    21  
    22  ## 安装
    23  
    24  使用 `go get` 下载安装
    25  
    26  ```sh
    27  go get -u github.com/aliyun/credentials-go
    28  ```
    29  
    30  ## 快速使用
    31  
    32  在您开始之前,您需要注册阿里云帐户并获取您的[凭证](https://usercenter.console.aliyun.com/#/manage/ak)。
    33  
    34  ### 凭证类型
    35  
    36  #### 使用默认凭据链
    37  当您在初始化凭据客户端不传入任何参数时,Credentials工具会使用默认凭据链方式初始化客户端。默认凭据的读取逻辑请参见[默认凭据链](#默认凭证提供程序链)。
    38  
    39  ```go
    40  import (
    41    "fmt"
    42  
    43    "github.com/aliyun/credentials-go/credentials"
    44  )
    45  
    46  func main(){
    47    provider, err := credentials.NewCredential(nil)
    48    if err != nil {
    49      return
    50    }
    51    credential, err := provider.GetCredential()
    52    if err != nil {
    53      return
    54    }
    55    accessKeyId := credential.AccessKeyId
    56    accessSecret := credential.AccessKeySecret
    57    securityToken := credential.SecurityToken
    58    credentialType := credential.Type
    59    fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
    60  }
    61  ```
    62  
    63  #### AccessKey
    64  
    65  通过[用户信息管理][ak]设置 access_key,它们具有该账户完全的权限,请妥善保管。有时出于安全考虑,您不能把具有完全访问权限的主账户 AccessKey 交于一个项目的开发者使用,您可以[创建RAM子账户][ram]并为子账户[授权][permissions],使用RAM子用户的 AccessKey 来进行API调用。
    66  
    67  ```go
    68  import (
    69    "fmt"
    70  
    71    "github.com/aliyun/credentials-go/credentials"
    72  )
    73  
    74  func main(){
    75    config := new(credentials.Config).
    76      // 设置凭证类型
    77      SetType("access_key").
    78      // 用户 AccessKey Id
    79      SetAccessKeyId("AccessKeyId").
    80      // 用户 AccessKey Secret
    81      SetAccessKeySecret("AccessKeySecret")
    82  
    83    provider, err := credentials.NewCredential(config)
    84    if err != nil {
    85      return
    86    }
    87    credential, err := provider.GetCredential()
    88    if err != nil {
    89      return
    90    }
    91    accessKeyId := credential.AccessKeyId
    92    accessSecret := credential.AccessKeySecret
    93    credentialType := credential.Type
    94    fmt.Println(accessKeyId, accessSecret, credentialType)
    95  }
    96  ```
    97  
    98  #### STS
    99  
   100  通过安全令牌服务(Security Token Service,简称 STS),申请临时安全凭证(Temporary Security Credentials,简称 TSC),创建临时安全凭证。
   101  
   102  ```go
   103  import (
   104    "fmt"
   105  
   106    "github.com/aliyun/credentials-go/credentials"
   107  )
   108  
   109  func main() {
   110    config := new(credentials.Config).
   111      // 设置凭证类型
   112      SetType("sts").
   113      // 临时用户 AccessKey Id
   114      SetAccessKeyId("AccessKeyId").
   115      // 临时用户 AccessKey Secret
   116      SetAccessKeySecret("AccessKeySecret").
   117      // 临时用户 Security Token
   118      SetSecurityToken("SecurityToken")
   119  
   120    provider, err := credentials.NewCredential(config)
   121    if err != nil {
   122      return
   123    }
   124  
   125    credential, err := provider.GetCredential()
   126    if err != nil {
   127      return
   128    }
   129    accessKeyId := credential.AccessKeyId
   130    accessSecret := credential.AccessKeySecret
   131    securityToken := credential.SecurityToken
   132    credentialType := credential.Type
   133    fmt.Println(accessKeyId, accessSecret, securityToken, credentialType)
   134  }
   135  ```
   136  
   137  #### AssumeRoleWithOIDC
   138  
   139  在容器服务 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权限隔离](https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-rrsa-to-authorize-pods-to-access-different-cloud-services#task-2142941)。
   140  
   141  ``` go
   142  package main
   143  
   144  import (
   145    "fmt"
   146  
   147    "github.com/aliyun/credentials-go/credentials"
   148  )
   149  
   150  func main() {
   151    config := new(credentials.Config).
   152      // 设置凭证类型
   153      SetType("oidc_role_arn").
   154      // OIDC提供商ARN,可以通过环境变量ALIBABA_CLOUD_OIDC_PROVIDER_ARN设置OidcProviderArn
   155      SetOIDCProviderArn("OIDCProviderArn").
   156      // OIDC Token文件路径,可以通过环境变量ALIBABA_CLOUD_OIDC_TOKEN_FILE设置OidcTokenFilePath
   157      SetOIDCTokenFilePath("OIDCTokenFilePath").
   158      // RAM角色名称ARN,可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
   159      SetRoleArn("RoleArn").
   160      // 角色会话名称,可以通过环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME设置RoleSessionName
   161      SetRoleSessionName("RoleSessionName").
   162      // 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
   163      SetPolicy("Policy").
   164      // 设置session过期时间,非必填。
   165      SetRoleSessionExpiration(3600).
   166      // 非必填,默认为sts.aliyuncs.com,建议使用Region化的STS域名,选择地理位置更接近的Region可以保证网络连通性,Region对应的域名请参考:https://api.aliyun.com/product/Sts
   167      SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
   168  
   169    provider, err := credentials.NewCredential(config)
   170    if err != nil {
   171      return
   172    }
   173  
   174    credential, err := provider.GetCredential()
   175    if err != nil {
   176      return
   177    }
   178    accessKeyId := credential.AccessKeyId
   179    accessSecret := credential.AccessKeySecret
   180    securityToken := credential.SecurityToken
   181    credentialType := credential.Type
   182  
   183    fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
   184  }
   185  ```
   186  
   187  #### RamRoleArn
   188  
   189  通过指定[RAM角色][RAM Role],让凭证自动申请维护 STS Token。你可以通过为 `Policy` 赋值来限制获取到的 STS Token 的权限。
   190  
   191  ```go
   192  import (
   193    "fmt"
   194  
   195    "github.com/aliyun/credentials-go/credentials"
   196  )
   197  
   198  func main(){
   199    config := new(credentials.Config).
   200      // 设置凭证类型
   201      SetType("ram_role_arn").
   202      // 用户 AccessKey Id
   203      SetAccessKeyId("AccessKeyId").
   204      // 用户 AccessKey Secret
   205      SetAccessKeySecret("AccessKeySecret").
   206      // 要扮演的RAM角色ARN,示例值:acs:ram::123456789012****:role/adminrole,可以通过环境变量ALIBABA_CLOUD_ROLE_ARN设置RoleArn
   207      SetRoleArn("RoleArn").
   208      // 角色会话名称,可以通过环境变量ALIBABA_CLOUD_ROLE_SESSION_NAME设置RoleSessionName
   209      SetRoleSessionName("RoleSessionName").
   210      // 设置更小的权限策略,非必填。示例值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
   211      SetPolicy("Policy").
   212      // 设置session过期时间,非必填。
   213      SetRoleSessionExpiration(3600).
   214      // 非必填,角色外部 ID,该参数为外部提供的用于表示角色的参数信息,主要功能是防止混淆代理人问题。更多信息请参考:https://help.aliyun.com/zh/ram/use-cases/use-externalid-to-prevent-the-confused-deputy-problem
   215      SetExternalId("ExternalId").
   216      // 非必填,默认为sts.aliyuncs.com,建议使用Region化的STS域名,选择地理位置更接近的Region可以保证网络连通性,Region对应的域名请参考:https://api.aliyun.com/product/Sts
   217      SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
   218  
   219    provider, err := credentials.NewCredential(config)
   220    if err != nil {
   221      return
   222    }
   223    credential, err := provider.GetCredential()
   224    if err != nil {
   225      return
   226    }
   227    accessKeyId := credential.AccessKeyId
   228    accessSecret := credential.AccessKeySecret
   229    securityToken := credential.SecurityToken
   230    credentialType := credential.Type
   231  
   232    fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
   233  }
   234  ```
   235  
   236  #### Credentials URI
   237  
   238  通过指定提供凭证的自定义网络服务地址,让凭证自动申请维护 STS Token。
   239  
   240  ```go
   241  import (
   242    "fmt"
   243  
   244    "github.com/aliyun/credentials-go/credentials"
   245  )
   246  
   247  func main(){
   248    config := new(credentials.Config).
   249      // 设置凭证类型
   250      SetType("credentials_uri").
   251      // 凭证的 URI,格式为http://local_or_remote_uri/,可以通过环境变量ALIBABA_CLOUD_CREDENTIALS_URI设置CredentialsUri
   252      SetURL("http://127.0.0.1")
   253    provider, err := credentials.NewCredential(config)
   254    if err != nil {
   255      return
   256    }
   257  
   258    credential, err := provider.GetCredential()
   259    if err != nil {
   260      return
   261    }
   262  
   263    accessKeyId := credential.AccessKeyId
   264    accessSecret := credential.AccessKeySecret
   265    securityToken := credential.SecurityToken
   266    credentialType := credential.Type
   267  
   268    fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
   269  }
   270  ```
   271  
   272  #### EcsRamRole
   273  
   274  Credentials工具会自动获取ECS实例绑定的RAM角色,调用ECS的元数据服务(Meta Data Server)换取STS Token,完成凭据客户端初始化。ECI实例,容器服务 Kubernetes 版的Worker节点均支持绑定实例RAM角色。
   275  
   276  ```go
   277  import (
   278    "fmt"
   279  
   280    "github.com/aliyun/credentials-go/credentials"
   281  )
   282  
   283  func main(){
   284    config := new(credentials.Config).
   285      // 设置凭证类型
   286      SetType("ecs_ram_role").
   287      // 选填,该ECS角色的角色名称,不填会自动获取,但是建议加上以减少请求次数,可以通过环境变量 ALIBABA_CLOUD_ECS_METADATA 设置 RoleName
   288      SetRoleName("RoleName").
   289      // 选填,推荐设置为 true,关闭 IMDS V1 的兜底能力,默认使用 IMDS V2(安全加固)。也可以通过环境变量 ALIBABA_CLOUD_IMDSV1_DISABLED 设置
   290      SetDisableIMDSv1(true)
   291  
   292    provider, err := credentials.NewCredential(config)
   293    if err != nil {
   294      return
   295    }
   296  
   297    credential, err := provider.GetCredential()
   298    if err != nil {
   299      return
   300    }
   301    accessKeyId := credential.AccessKeyId
   302    accessSecret := credential.AccessKeySecret
   303    securityToken := credential.SecurityToken
   304    credentialType := credential.Type
   305  
   306    fmt.Println(accessKeyId, accessKeySecret, securityToken, credentialType)
   307  }
   308  ```
   309  
   310  #### Bearer Token
   311  
   312  目前只有云呼叫中心 CCC 这款产品支持 Bearer Token 的凭据初始化方式。
   313  
   314  ```go
   315  import (
   316   "fmt"
   317  
   318   "github.com/aliyun/credentials-go/credentials"
   319  )
   320  
   321  func main(){
   322    config := new(credentials.Config).
   323      // 设置凭证类型
   324      SetType("bearer").
   325      // 填入您的Bearer Token
   326      SetBearerToken("BearerToken")
   327  
   328    provider, err := credentials.NewCredential(config)
   329    if err != nil {
   330      return
   331    }
   332  
   333    credential, err := provider.GetCredential()
   334    if err != nil {
   335      return
   336    }
   337  
   338    bearerToken := credential.BearerToken
   339    credentialType := credential.Type
   340    fmt.Println(bearerToken, credentialType)
   341  }
   342  ```
   343  
   344  ### 凭证提供程序链
   345  
   346  当开发环境与生产环境使用的凭据类型不一致时,常见做法是在代码中获取当前环境信息,编写获取不同凭据的分支代码。借助Credentials工具的默认凭据链,您可以用同一套代码,通过程序之外的配置来控制不同环境下的凭据获取方式。当您使用 `NewCredential()` 初始化凭据客户端,且不传入任何参数时,阿里云SDK将会尝试按照如下顺序查找相关凭据信息。
   347  
   348  #### 1. 使用环境变量
   349  
   350  Credentials工具会优先在环境变量中获取凭据信息。
   351  
   352  - 如果系统环境变量 `ALIBABA_CLOUD_ACCESS_KEY_ID`(密钥Key) 和 `ALIBABA_CLOUD_ACCESS_KEY_SECRET`(密钥Value) 不为空,Credentials工具会优先使用它们作为默认凭据。
   353  
   354  - 如果系统环境变量 `ALIBABA_CLOUD_ACCESS_KEY_ID`(密钥Key)、`ALIBABA_CLOUD_ACCESS_KEY_SECRET`(密钥Value)、`ALIBABA_CLOUD_SECURITY_TOKEN`(Token)均不为空,Credentials工具会优先使用STS Token作为默认凭据。
   355  
   356  ### 2. 使用OIDC RAM角色
   357  若不存在优先级更高的凭据信息,Credentials工具会在环境变量中获取如下内容:
   358  
   359  `ALIBABA_CLOUD_ROLE_ARN`:RAM角色名称ARN;
   360  
   361  `ALIBABA_CLOUD_OIDC_PROVIDER_ARN`:OIDC提供商ARN;
   362  
   363  `ALIBABA_CLOUD_OIDC_TOKEN_FILE`:OIDC Token文件路径;
   364  
   365  若以上三个环境变量都已设置内容,Credentials将会使用变量内容调用STS服务的[AssumeRoleWithOIDC - OIDC角色SSO时获取扮演角色的临时身份凭证](https://help.aliyun.com/zh/ram/developer-reference/api-sts-2015-04-01-assumerolewithoidc)接口换取STS Token作为默认凭据。
   366  
   367  ### 3. 使用 Aliyun CLI 工具的 config.json 配置文件
   368  
   369  若不存在优先级更高的凭据信息,Credentials工具会优先在如下位置查找 `config.json` 文件是否存在:
   370  Linux系统:`~/.aliyun/config.json`
   371  Windows系统: `C:\Users\USER_NAME\.aliyun\config.json`
   372  如果文件存在,程序将会使用配置文件中 `current` 指定的凭据信息初始化凭据客户端。当然,您也可以通过环境变量 `ALIBABA_CLOUD_PROFILE` 来指定凭据信息,例如设置 `ALIBABA_CLOUD_PROFILE` 的值为 `AK`。
   373  
   374  在config.json配置文件中每个module的值代表了不同的凭据信息获取方式:
   375  
   376  - AK:使用用户的Access Key作为凭据信息;
   377  - RamRoleArn:使用RAM角色的ARN来获取凭据信息;
   378  - EcsRamRole:利用ECS绑定的RAM角色来获取凭据信息;
   379  - OIDC:通过OIDC ARN和OIDC Token来获取凭据信息;
   380  - ChainableRamRoleArn:采用角色链的方式,通过指定JSON文件中的其他凭据,以重新获取新的凭据信息。
   381  
   382  配置示例信息如下:
   383  
   384  ```json
   385  {
   386      "current": "AK",
   387      "profiles": [
   388          {
   389              "name": "AK",
   390              "mode": "AK",
   391              "access_key_id": "access_key_id",
   392              "access_key_secret": "access_key_secret"
   393          },
   394          {
   395              "name": "RamRoleArn",
   396              "mode": "RamRoleArn",
   397              "access_key_id": "access_key_id",
   398              "access_key_secret": "access_key_secret",
   399              "ram_role_arn": "ram_role_arn",
   400              "ram_session_name": "ram_session_name",
   401              "expired_seconds": 3600,
   402              "sts_region": "cn-hangzhou"
   403          },
   404          {
   405              "name": "EcsRamRole",
   406              "mode": "EcsRamRole",
   407              "ram_role_name": "ram_role_name"
   408          },
   409          {
   410              "name": "OIDC",
   411              "mode": "OIDC",
   412              "ram_role_arn": "ram_role_arn",
   413              "oidc_token_file": "path/to/oidc/file",
   414              "oidc_provider_arn": "oidc_provider_arn",
   415              "ram_session_name": "ram_session_name",
   416              "expired_seconds": 3600,
   417              "sts_region": "cn-hangzhou"
   418          },
   419          {
   420              "name": "ChainableRamRoleArn",
   421              "mode": "ChainableRamRoleArn",
   422              "source_profile": "AK",
   423              "ram_role_arn": "ram_role_arn",
   424              "ram_session_name": "ram_session_name",
   425              "expired_seconds": 3600,
   426              "sts_region": "cn-hangzhou"
   427          }
   428      ]
   429  }
   430  ```
   431  
   432  ### 4. 使用配置文件
   433  >
   434  > 如果用户主目录存在默认文件 `~/.alibabacloud/credentials` (Windows 为 `C:\Users\USER_NAME\.alibabacloud\credentials`),程序会自动创建指定类型和名称的凭证。您也可通过环境变量 `ALIBABA_CLOUD_CREDENTIALS_FILE` 指定配置文件路径。如果文件存在,程序将会使用配置文件中 default 指定的凭据信息初始化凭据客户端。当然,您也可以通过环境变量 `ALIBABA_CLOUD_PROFILE` 来指定凭据信息,例如设置 `ALIBABA_CLOUD_PROFILE` 的值为 `client1`。
   435  
   436  配置示例信息如下:
   437  
   438  ```ini
   439  [default]
   440  type = access_key                  # 认证方式为 access_key
   441  access_key_id = foo                # Key
   442  access_key_secret = bar            # Secret
   443  
   444  [project1]
   445  type = ecs_ram_role                # 认证方式为 ecs_ram_role
   446  role_name = EcsRamRoleTest         # Role Name,非必填,不填则自动获取,建议设置,可以减少网络请求。
   447  
   448  [project2]
   449  type = ram_role_arn                # 认证方式为 ram_role_arn
   450  access_key_id = foo
   451  access_key_secret = bar
   452  role_arn = role_arn
   453  role_session_name = session_name
   454  
   455  [project3]
   456  type=oidc_role_arn                 # 认证方式为 oidc_role_arn
   457  oidc_provider_arn=oidc_provider_arn
   458  oidc_token_file_path=oidc_token_file_path
   459  role_arn=role_arn
   460  role_session_name=session_name
   461  ```
   462  
   463  ### 5. 使用 ECS 实例RAM角色
   464  
   465  如果定义了环境变量 `ALIBABA_CLOUD_ECS_METADATA` 且不为空,程序会将该环境变量的值作为角色名称,请求 `http://100.100.100.200/latest/meta-data/ram/security-credentials/` 获取临时安全凭证作为默认凭证。
   466  
   467  ### 6. 使用外部服务 Credentials URI
   468  
   469  若不存在优先级更高的凭据信息,Credentials工具会在环境变量中获取ALIBABA_CLOUD_CREDENTIALS_URI,若存在,程序将请求该URI地址,获取临时安全凭证作为默认凭据信息。
   470  
   471  外部服务响应结构应如下:
   472  
   473  ```json
   474  {
   475    "Code": "Success",
   476    "AccessKeyId": "AccessKeyId",
   477    "AccessKeySecret": "AccessKeySecret",
   478    "SecurityToken": "SecurityToken",
   479    "Expiration": "2024-10-26T03:46:38Z"
   480  }
   481  ```
   482  
   483  ## 许可证
   484  
   485  [Apache-2.0](/LICENSE)
   486  
   487  Copyright (c) 2009-present, Alibaba Cloud All rights reserved.
   488  
   489  [ak]: https://usercenter.console.aliyun.com/#/manage/ak
   490  [ram]: https://ram.console.aliyun.com/users
   491  [permissions]: https://ram.console.aliyun.com/permissions
   492  [RAM Role]: https://ram.console.aliyun.com/#/role/list