STS相關接口
更新時間 2025-09-28 10:58:17
最近更新時間: 2025-09-28 10:58:17
分享文章
STS即Secure Token Service 是一種安全憑證服務,可以使用STS來完成對于臨時用戶的訪問授權。對于跨用戶短期訪問對象存儲資源時,可以使用STS服務。這樣就不需要透露主賬號AK/SK,只需要生成一個短期訪問憑證給需要的用戶使用即可,避免主賬號AK/SK泄露帶來的安全風險。
初始化STS服務
ak := "<your-access-key>"
sk := "<your-secret-access-key>"
endpoint := "<your-endpoint>"
config := &aws.Config{
Credentials: credentials.NewStaticCredentials(ak, sk, ""),
Endpoint: aws.String(endpoint),
S3ForcePathStyle: aws.Bool(true),
DisableSSL: aws.Bool(true),
LogLevel: aws.LogLevel(aws.LogDebug),
}
sess := session.Must(session.NewSession(config))
svc := sts.New(sess)獲取臨時token
bucket := "<your-bucket-name>"
roleSessionName := "<your-session-name>"
arn := "arn:aws:iam:::role/xxxxxx"
policy := `{"Version":"2012-10-17","Statement":{"Effect":"Allow","Action":["s3:*"],"Resource":["arn:aws:s3:::%s","arn:aws:s3:::%s/*"]}}`
policy = fmt.Sprintf(policy, bucket, bucket)
fmt.Println("policy: ", policy)
out, err := svc.AssumeRole(&sts.AssumeRoleInput{
Policy: aws.String(policy),
RoleArn: aws.String(arn),
RoleSessionName: aws.String(roleSessionName),
})
if err != nil {
fmt.Println("err, ", err)
return
}
fmt.Println("assumeRole success, ", out)請求參數
| 參數 | 類型 | 描述 | 是否必要 |
|---|---|---|---|
| RoleArn | *string | 角色的ARN,在控制臺創建角色后可以查看 | 是 |
| Policy | *string | 角色的policy,需要是json格式,限制長度1~2048 | 是 |
| RoleSessionName | *string | 角色會話名稱,此字段為用戶自定義,限制長度2~64 | 是 |
| DurationSeconds | Integer | 會話有效期時間,默認為3600s | 否 |
使用臨時token
實現一個CredentialsProvider,支持更新ak/sk和token。
type MyCredProvider struct {
sync.Mutex
?
value *credentials.Value
}
?
func NewMyCredProvider(ak, sk, token string) *MyCredProvider{
p := &MyCredProvider{
value: &credentials.Value{
AccessKeyID: ak,
SecretAccessKey: sk,
SessionToken: token,
ProviderName: "MyCredProvider",
},
}
return p
}
?
func (p *MyCredProvider) Retrieve() (credentials.Value, error) {
defer p.Unlock()
p.Lock()
?
return *p.value, nil
}
?
func (p *MyCredProvider) IsExpired() bool {
return false
}
?
// 更新token
func (p *MyCredProvider) UpdateCred(ak, sk, token string) {
defer p.Unlock()
p.Lock()
?
p.value.AccessKeyID = ak
p.value.SecretAccessKey = sk
p.value.SessionToken = token
}
使用臨時token
ak := "<temporary-access-key>"
sk := "<temporary-secret-access-key>"
token := "<your-session-token>"
endpoint := "<your-endpoint>"
credProvider := NewMyCredProvider(ak, sk, token)
config := &aws.Config{
Credentials: credentials.NewCredentials(credProvider),
Endpoint: aws.String(endpoint),
S3ForcePathStyle: aws.Bool(true),
DisableSSL: aws.Bool(true),
LogLevel: aws.LogLevel(aws.LogDebug),
}
sess := session.Must(session.NewSession(config))
svc := s3.New(sess)