Este tópico aborda os conceitos principais, métodos de configuração, políticas de controle de acesso, casos de uso típicos e soluções de problemas para SourceIdentity.
O que é SourceIdentity?
SourceIdentity é um identificador definido para a sessão atual ao chamar uma operação OpenAPI para assumir uma função RAM e obter credenciais temporárias (um token STS).
SourceIdentity tem duas finalidades principais:
-
Rastrear identidades em cenários complexos, como encadeamento de funções
O encadeamento de funções ocorre quando uma identidade RAM (ou um usuário SSO de função) assume uma função para obter uma sessão e, em seguida, usa essa sessão para assumir outra função. Por exemplo: Usuário A → Função B → Função C. As funções RAM em uma cadeia podem pertencer à mesma conta Alibaba Cloud ou a contas diferentes (entre contas).
Em um cenário de assunção de função, defina
RoleSessionNamepara auditar a identidade de origem. No entanto, no encadeamento de funções, o valor deRoleSessionNamepode mudar durante as múltiplas assunções, dificultando o rastreamento do usuário original.Ao definir
SourceIdentityno início de uma cadeia de funções, seu valor persiste e não pode ser alterado dentro da sessão. Isso garante o rastreamento do usuário original por meio dos logs, mesmo após várias assunções de função.Para ver um exemplo detalhado de como
SourceIdentityfunciona no encadeamento de funções, consulte Exemplo de encadeamento de funções. -
Aplicar controle de acesso granular a funções com altos privilégios
Administradores configuram permissões granulares com base no valor ou na presença de
SourceIdentity. Esse controle é especialmente útil quando várias identidades compartilham uma mesma função.Por exemplo, um administrador usa uma chave de condição em uma política para exigir a definição de um valor específico de
SourceIdentityao assumir uma função. Dessa forma, restringe-se o acesso a uma função altamente privilegiada ou a recursos essenciais apenas para identidades de origem específicas.
Como definir SourceIdentity
Defina SourceIdentity chamando uma das três operações de API do Security Token Service (STS) abaixo ao assumir uma função.
AssumeRole
Ao chamar a operação de API AssumeRole, especifique as informações da identidade de origem usando o parâmetro SourceIdentity. Por exemplo, defina-o como Alice. Este método é adequado para cenários padrão de assunção de função, nos quais um usuário RAM ou uma função RAM assume outra função.
Após uma chamada bem-sucedida, SourceIdentity é retornado como um campo de nível superior na resposta. O código a seguir mostra um exemplo de resposta:
{
"RequestId": "6894B13B-6D71-4EF5-88FA-F3278173****",
"AssumedRoleUser": {
"AssumedRoleId": "34458433936495****:alice",
"Arn": "acs:ram::123456789012****:role/alice"
},
"Credentials": {
"SecurityToken": "********",
"Expiration": "2015-04-09T11:52:19Z",
"AccessKeySecret": "wyLTSmsyPGP1ohvvw8xYgB29dlGI8KMiH2pK****",
"AccessKeyId": "STS.L4aBSCSJVMuKg5U1****"
},
"SourceIdentity": "Alice"
}
Para mais informações sobre como chamar esta operação, consulte AssumeRole - Obter credenciais temporárias para uma função assumida.
AssumeRoleWithSAML
Em um cenário de SSO baseado em função SAML, o provedor de identidade (IdP) fornece o valor de SourceIdentity na asserção SAML.
Configure um atributo SAML no seu IdP e mapeie-o para um identificador do usuário, como o nome de usuário. O nome desse atributo deve ser https://www.aliyun.com/SAML-Role/Attributes/SourceIdentity.
Após concluir a configuração, a resposta SAML emitida pelo IdP contém a seguinte asserção (considerando que o prefixo UPN do usuário esteja mapeado para o valor de SourceIdentity):
<Attribute Name="https://www.aliyun.com/SAML-Role/Attributes/SourceIdentity">
<AttributeValue>upn_prefix</AttributeValue>
</Attribute>
A resposta de uma chamada bem-sucedida é igual à da operação AssumeRole. Para mais informações sobre como chamar esta operação, consulte Obter credenciais temporárias para uma função assumida durante o SSO baseado em função SAML.
AssumeRoleWithOIDC
Em um cenário de SSO baseado em função OIDC, o IdP fornece o valor de SourceIdentity como uma declaração no token de ID (também conhecido como token OIDC).
Configure uma declaração personalizada de token de ID no seu IdP e mapeie-a para um identificador do usuário, como o nome de usuário. O nome dessa declaração deve ser https://www.aliyun.com/source_identity. Por exemplo:
Após concluir a configuração, o token de ID emitido pelo IdP contém a seguinte declaração (considerando que o prefixo UPN do usuário esteja mapeado para o valor de SourceIdentity):
{
"https://www.aliyun.com/source_identity": "upn_prefix"
}
A resposta de uma chamada bem-sucedida é igual à da operação AssumeRole. Para mais informações sobre como chamar esta operação, consulte AssumeRoleWithOIDC - Obter credenciais temporárias para uma função assumida durante o SSO baseado em função OIDC.
Requisitos de formato
O valor deve ter entre 2 e 64 caracteres.
São permitidas letras, dígitos e os seguintes caracteres especiais:
=,,,.,@,-e_.Não utilize prefixos reservados pela Alibaba Cloud, como
acs:,aliyun:oualibabacloud:.
Permissões e controle de condições
Combine políticas baseadas em identidade e políticas de confiança para controlar o uso de SourceIdentity.
Ações
|
Parâmetro |
Tipo |
Escopo |
Descrição |
|
|
Action |
|
Concede permissão para definir |
Exemplo de configuração de ação
Para permitir que uma identidade (usuário ou função RAM) defina SourceIdentity ao chamar AssumeRole, conceda a permissão sts:SetSourceIdentity tanto na política baseada em identidade do principal quanto na política de confiança da função de destino. Para isso, adicione sts:SetSourceIdentity ao bloco Action.
-
Exemplo de política baseada em identidade (concedida ao chamador):
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_ID:role/TARGET_ROLE" } ] } -
Exemplo de política de confiança (configurada na função a ser assumida):
{ "Statement": [ { "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::ACCOUNT_ID:root" ] } } ], "Version": "1" }
Configuração de ação para SSO de função
Ao assumir uma função chamando as operações AssumeRoleWithSAML ou AssumeRoleWithOIDC, conceda a permissão sts:SetSourceIdentity apenas na política de confiança da função de destino. A política a seguir é um exemplo para SSO baseado em função SAML:
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"saml:recipient": [
"https://signin.aliyun.com/saml-role/sso"
]
}
},
"Effect": "Allow",
"Principal": {
"Federated": [
"acs:ram::ACCOUNT_ID:saml-provider/PROVIDER_NAME"
]
}
}
],
"Version": "1"
}
Se você configurar o atributo SourceIdentity no seu IdP, deve incluir a ação sts:SetSourceIdentity nas políticas de confiança de todas as funções associadas a esse IdP. Caso contrário, as tentativas de login via SSO falharão.
Chaves de condição
|
Parâmetro |
Tipo |
Escopo |
Descrição |
|
|
Chave de condição |
|
Associa um ou mais valores de |
|
|
Chave de condição (global) |
|
Associa um ou mais valores de |
Atualmente, a chave de condição acs:SourceIdentity é avaliada apenas em políticas STS.
A diferença entre as chaves de condição sts:SourceIdentity e acs:SourceIdentity é a seguinte:
sts:SourceIdentitycorresponde ao atributoSourceIdentityna solicitação de assunção de função.acs:SourceIdentitycorresponde ao atributoSourceIdentitypresente na sessão de função (incluindo o token STS) após uma assunção bem-sucedida.
Para a assunção inicial de função, use a chave de condição sts:SourceIdentity nas suas políticas, incluindo políticas baseadas em identidade e políticas de confiança. Nessa etapa, ainda não existe uma sessão de função válida; portanto, usar a chave de condição acs:SourceIdentity causará falha na assunção.
Exemplo de controle de condição
Ao usar a chave de condição sts:SourceIdentity no bloco Condition de uma política, você exige a transmissão de um valor específico de SourceIdentity ao assumir uma função. Configure condições em um ou ambos os tipos de política a seguir:
Definir uma condição em uma política baseada em identidade: Restringe a identidade a definir um valor específico de
SourceIdentityao assumir uma função específica.Definir uma condição em uma política de confiança: Restringe qualquer identidade a definir um valor específico de
SourceIdentityao assumir esta função.
Inclua também a ação sts:SetSourceIdentity no bloco Action da política para que a condição tenha efeito.
Após fazer login no console, um usuário RAM não consegue usar o recurso Switch Role para assumir uma função que exija a definição de SourceIdentity. Isso ocorre porque o console não oferece suporte à inserção desse parâmetro.
Suponha que exista uma função RAM com altos privilégios para o ambiente de produção chamada prod-role. Um administrador precisa implementar os seguintes controles:
Apenas os usuários RAM Alice e Bob podem assumir
prod-role.Ao assumir
prod-role, é obrigatório definirSourceIdentity, e seu valor deve corresponder ao nome de usuário de quem está assumindo a função. Por exemplo, quando Alice assume a função, ela define o valor comoaliceoualice@exampledomain.com.
Etapa 1: Configurar a política de confiança para prod-role
Esta política garante que apenas Alice e Bob possam assumir esta função e que a solicitação inclua um valor de SourceIdentity que comece com alice ou bob.
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringLike": {
"sts:SourceIdentity": [
"alice*",
"bob*"
]
}
},
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::ACCOUNT_ID:user/alice",
"acs:ram::ACCOUNT_ID:user/bob"
]
}
}
],
"Version": "1"
}
Etapa 2: Configurar políticas baseadas em identidade para os usuários Alice e Bob
As políticas a seguir concedem a Alice e Bob permissão para assumir prod-role e impõem que eles definam um SourceIdentity correspondente aos seus respectivos nomes de usuário na solicitação.
-
Política baseada em identidade para Alice
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_ID:role/prod-role", "Condition": { "StringLike": { "sts:SourceIdentity": [ "alice*" ] } } } ] } -
Política baseada em identidade para Bob
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_ID:role/prod-role", "Condition": { "StringLike": { "sts:SourceIdentity": [ "bob*" ] } } } ] }
Controle de condição para SSO de função
Suponha que a função dev-role só possa ser assumida por meio de SSO baseado em função SAML, e apenas por usuários com IDs de funcionário employeeid-alice e employeeid-bob. O IdP inclui o ID de funcionário do usuário como valor de SourceIdentity na asserção SAML.
A política de confiança para dev-role é configurada da seguinte forma:
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"saml:recipient": [
"https://signin.aliyun.com/saml-role/sso"
],
"sts:SourceIdentity": [
"employeeid-alice",
"employeeid-bob"
]
}
},
"Effect": "Allow",
"Principal": {
"Federated": [
"acs:ram::ACCOUNT_ID:saml-provider/PROVIDER_NAME"
]
}
}
],
"Version": "1"
}
Recomendações para uso de controle de condição
Teste antes de implantar em produção: Não ative políticas obrigatórias de
SourceIdentitydiretamente no ambiente de produção. Isso inclui qualquer política baseada em identidade ou política de confiança que contenha a chave de condiçãosts:SourceIdentity. Recomendamos usar primeiro uma função e uma política de teste para validar a configuração. Após confirmar o funcionamento esperado, aplique-a gradualmente ao seu ambiente de produção.Comunique-se antecipadamente: Antes de ativar políticas obrigatórias, informe a todos os usuários relevantes como usar
SourceIdentitye quais valores são permitidos, evitando interrupções nos fluxos de trabalho.
Exemplo de encadeamento de funções
Cenário
Uma ferramenta de automação CI/CD, como o Jenkins, executa com uma função RAM chamada automation-role. Desenvolvedores como Alice e Bob podem assumir essa função.
Um desenvolvedor, como Alice, usa a ferramenta para implantar um aplicativo em um Bucket OSS no ambiente de produção. A ação de implantação exige assumir uma função com mais privilégios, deploy-role, que possui permissões de gravação no Bucket OSS.
Alice, Bob e automation-role pertencem à conta Alibaba Cloud A, enquanto deploy-role pertence à conta Alibaba Cloud B.
Requisito de negócio e fluxo de trabalho
O objetivo é permitir que automation-role assuma deploy-role apenas quando Alice for a chamadora original. Qualquer solicitação de outro usuário, como Bob, deve ser negada.
O fluxo de trabalho é o seguinte:
Alice chama a operação
AssumeRolepara assumirautomation-rolee defineSourceIdentitycomoalicena solicitação.Depois que
automation-roleobtém um token STS, ela chama novamente a operaçãoAssumeRolepara assumirdeploy-role. O valor deSourceIdentityé transmitido automaticamente.A política de confiança de
deploy-roleverifica se oSourceIdentityrecebido éalice. Se a validação for aprovada, a assunção de função é permitida.
Etapas de configuração de política
Etapa 1: Modificar a política de confiança de deploy-role
Esta política permite solicitações de assunção apenas de automation-role na conta A, e somente se o valor de SourceIdentity for alice.
{
"Statement": [
{
"Action": [
"sts:AssumeRole",
"sts:SetSourceIdentity"
],
"Condition": {
"StringEquals": {
"acs:SourceIdentity": [
"alice"
]
}
},
"Effect": "Allow",
"Principal": {
"RAM": [
"acs:ram::ACCOUNT_A_ID:role/automation-role"
]
}
}
],
"Version": "1"
}
A política de confiança acima usa a chave de condição acs:SourceIdentity em vez de sts:SourceIdentity. Isso garante que deploy-role aceite solicitações de acesso apenas da função automation-role e somente se o SourceIdentity na sessão de função já estiver definido como alice.
Etapa 2: Modificar as políticas de permissão e de confiança de automation-role
-
Política baseada em identidade: Permite que a função
automation-roleassuma a funçãodeploy-rolena conta B.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_B_ID:role/deploy-role" } ] } -
Política de confiança: Permite que Alice e Bob assumam
automation-role.{ "Statement": [ { "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::ACCOUNT_A_ID:user/alice", "acs:ram::ACCOUNT_A_ID:user/bob" ] } } ], "Version": "1" }
Etapa 3: Modificar as políticas baseadas em identidade para Alice e Bob
Permita que eles assumam a função automation-role e imponha a definição de um valor de SourceIdentity que corresponda exatamente ao nome de usuário de cada um.
-
Política baseada em identidade para Alice
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_A_ID:role/automation-role", "Condition": { "StringEquals": { "sts:SourceIdentity": [ "alice" ] } } } ] } -
Política baseada em identidade para Bob
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "acs:ram::ACCOUNT_A_ID:role/automation-role", "Condition": { "StringEquals": { "sts:SourceIdentity": [ "bob" ] } } } ] }
SourceIdentity no ActionTrail
Encontre o campo SourceIdentity nos logs de auditoria do ActionTrail para rastreamento de identidade.
-
Nos logs de eventos
AssumeRole*:SourceIdentityaparece nos camposresponseElementserequestParameters.{ "eventId": "9BCD28D0-7FDB-5BF2-9302-CDA6CCC5****", "eventVersion": 1, "responseElements": { "SourceIdentity": "alice", "RequestId": "9BCD28D0-7FDB-5BF2-9302-CDA6CCC5****", ... }, ... "requestParameters": { "SourceIdentity": "alice", "X-Acs-Request-Id": "9BCD28D0-7FDB-5BF2-9302-CDA6CCC5****", ... }, "serviceName": "Sts", "eventName": "AssumeRole", ... }
-
Nos logs de eventos de acesso a recursos de nuvem:
SourceIdentityaparece no campouserIdentity.sessionContext.{ "eventId": "46B5B0A1-19F7-5A56-BE2C-0BCFE5F8****", "userIdentity": { "sessionContext": { "sourceIdentity": "alice", ... }, "type": "assumed-role", ... }, "serviceName": "Ecs", "eventName": "DescribeInstances", ... }
Solução de problemas
O problema mais comum ao configurar SourceIdentity é a falta de permissões. As seções a seguir descrevem dois cenários de erro típicos e suas soluções.
Cenário 1: Problema na política baseada em identidade
Mensagem de erro:
{
"RequestId": "AC9DDEC1-3E1F-50B8-A2D1-BAA155FD****",
"Code": "NoPermission",
"Message": "You are not authorized to do this action. You should be authorized by RAM.",
"AccessDeniedDetail": {
"PolicyType": "AccountLevelIdentityBasedPolicy",
"AuthAction": "sts:SetSourceIdentity",
...
}
}
Causa:
"PolicyType": "AccountLevelIdentityBasedPolicy"indica que o erro foi causado pela política baseada em identidade do chamador."AuthAction": "sts:SetSourceIdentity"indica que falta permissão para a açãosts:SetSourceIdentity.
Solução: Solicite ao administrador que verifique a política baseada em identidade do chamador e garanta o seguinte:
A política inclui
"Action": "sts:SetSourceIdentity".O escopo de
Resourceda política inclui a função de destino que você está tentando assumir.Se a política contiver uma
Condition, confirme se o valor deSourceIdentityna sua solicitação atende à condição.
Cenário 2: Problema na política de confiança
Mensagem de erro:
{
"RequestId": "ECC91EE1-0EB0-5E79-B3F5-E54FD8B9****",
"Code": "NoPermission",
"Message": "You are not authorized to do this action. You should be authorized by RAM.",
"AccessDeniedDetail": {
"PolicyType": "AssumeRolePolicy",
"AuthAction": "sts:SetSourceIdentity",
...
}
}
Causa:
"PolicyType": "AssumeRolePolicy"indica que o erro foi causado pela política de confiança da função de destino."AuthAction": "sts:SetSourceIdentity"indica que a função de destino não confia na açãosts:SetSourceIdentity.
Solução: Solicite ao administrador que verifique a política de confiança da função de destino e garanta o seguinte:
A política inclui
"Action": "sts:SetSourceIdentity".Se a política contiver uma
Condition, confirme se o valor deSourceIdentityna sua solicitação atende à condição.
Conselhos gerais para solução de problemas
Reduza o escopo: Se encontrar um problema de permissão ao definir
SourceIdentity, tente remover o parâmetroSourceIdentitye assumir a função novamente. Se a ação for bem-sucedida, o problema provavelmente está nas configurações de permissão relacionadas aSourceIdentity.Analise a mensagem de erro: Leia a seção
AccessDeniedDetailda mensagem de erro, especialmente o campoPolicyType. Ele ajuda a determinar rapidamente se o problema está em uma política baseada em identidade ou em uma política de confiança.-
Use ferramentas de diagnóstico: Se você tiver apenas o
RequestId, utilize a ferramenta OpenAPI Explorer. Insira oRequestIde o sistema retornará informações diagnósticas detalhadas para ajudar a identificar o problema de permissão. Por exemplo:Um resultado de diagnóstico mostra um ErrorCode de
NoPermissione um ErrorMessage deYou are not authorized to do this action. You should be authorized by RAM.. A conclusão da verificação de permissão é Not authorized by identity-based policy (account-level) para a açãosts:SetSourceIdentity. A solução sugere conceder ao usuário RAM a política de sistemaAliyunSTSAssumeRoleAccess, associada asts:SetSourceIdentity, ou criar uma política personalizada. Compare a política com a solicitação: Após localizar a política, verifique se as configurações de
ResourceeConditioncorrespondem aos parâmetros da sua solicitação de API, como oARNda função de destino e o valor deSourceIdentity.
Para mais informações sobre solução de problemas de permissão, consulte Como solucionar erros de acesso negado.