Concedendo a Cargas de Trabalho Acesso aos Recursos do OCI
Descubra como usar a identidade de uma carga de trabalho em execução em um cluster do Kubernetes para conceder à carga de trabalho acesso refinado a outros recursos do OCI usando o Kubernetes Engine (OKE).
Você só pode usar identidades de carga de trabalho para conceder acesso aos recursos do OCI ao usar clusters aprimorados. Consulte Clusters Avançados.
No Kubernetes, uma carga de trabalho é um aplicativo em execução em um cluster do Kubernetes. Uma carga de trabalho pode ser um componente de aplicativo em execução dentro de um único pod ou vários componentes de aplicativo em execução dentro de um conjunto de pods que funcionam juntos. Todos os pods na carga de trabalho são executados no mesmo namespace.
Para conceder a todos os pods em uma carga de trabalho acesso aos recursos do Kubernetes, você pode especificar que cada pod na carga de trabalho deve usar a mesma conta de serviço do Kubernetes. Em seguida, você pode conceder permissões de atribuição de cluster do Kubernetes à conta de serviço. É a conta de serviço que vincula os pods na carga de trabalho às permissões de atribuição do cluster e concede aos pods acesso aos recursos do Kubernetes.
No Oracle Cloud Infrastructure, uma carga de trabalho em execução em um cluster do Kubernetes é considerada um recurso por si só. Um recurso de carga de trabalho é identificado pela combinação exclusiva de cluster, namespace e conta de serviço. Essa combinação exclusiva é chamada de identidade da carga de trabalho. Você pode usar a identidade da carga de trabalho ao definir políticas do serviço IAM para conceder acesso detalhado a outros recursos do OCI (como buckets do Object Storage). Além disso, você pode usar o Oracle Cloud Infrastructure Audit para atender aos requisitos de conformidade, rastreando solicitações feitas pela identidade da carga de trabalho, permitindo monitorar e relatar acesso não autorizado e atividades suspeitas.
Para conceder a todos os pods em uma carga de trabalho acesso aos recursos do OCI:
- Crie um namespace para uma conta de serviço.
- Crie uma conta de serviço para o aplicativo usar.
- Defina uma política do serviço IAM para conceder ao recurso de carga de trabalho acesso a outros recursos do OCI.
- Faça download e configure o OCI SDK apropriado para o idioma no qual o aplicativo foi gravado.
- Edite o aplicativo para especificar:
-
- que as solicitações de carga de trabalho devem ser autenticadas usando o provedor de identidades de carga de trabalho do Kubernetes Engine
- os recursos do OCI que devem ser acessados
- Atualize a especificação de implantação do aplicativo para especificar que cada pod na carga de trabalho deve usar a conta de serviço.
Observe o seguinte ao usar identidades de carga de trabalho:
- No momento, não é possível usar identidades de carga de trabalho com grupos dinâmicos.
- Você só pode usar identidades de carga de trabalho com um SDK do OCI, não com a Console ou a API.
- Os seguintes SDKs do OCI atualmente suportam identidades de carga de trabalho:
- Go SDK v65.32.0 (e posterior)
- Java SDK v2.54.0 (e posterior)
- Python SDK v2.111.0 (e posterior)
Exemplo: Usando o Go SDK para Conceder às Cargas de Trabalho do Aplicativo Acesso aos Recursos do OCI
Para conceder às cargas de trabalho do aplicativo Go em execução em um cluster do Kubernetes acesso a outros recursos do OCI:
-
Se você ainda não tiver feito isso, siga as etapas para configurar o arquivo de configuração kubeconfig do cluster e (se necessário) defina a variável de ambiente KUBECONFIG para apontar para o arquivo. Observe que você deve configurar seu próprio arquivo kubeconfig. Não é possível acessar um cluster usando um arquivo kubeconfig que outro usuário tenha configurado. Consulte Configurando o Acesso ao Cluster.
- Obtenha o OCID do cluster (por exemplo, usando a guia Detalhes do Cluster na Console).
-
Crie um namespace para a conta de serviço do Kubernetes a ser usada digitando:
kubectl create namespace <namespace-name>
Por exemplo:
kubectl create namespace finance
- Crie uma conta de serviço do Kubernetes para o aplicativo usar digitando:
kubectl create serviceaccount <service-account-name> --namespace <namespace-name>
Por exemplo:
kubectl create serviceaccount financeserviceaccount --namespace finance
- Defina uma política de IAM para permitir que a carga de trabalho acesse os recursos necessários do OCI:
- Abra o menu de navegação e clique em Identidade e Segurança. Em Identidade, clique em Políticas.
- Siga as instruções em Para criar uma política e dê um nome à política (por exemplo,
acme-oke-finance-workload-policy
). -
Digite uma instrução de política para permitir que a carga de trabalho acesse os recursos necessários do OCI, no formato:
Allow any-user to <verb> <resource> in <location> where all { request.principal.type = 'workload', request.principal.namespace = '<namespace-name>', request.principal.service_account = '<service-account-name>', request.principal.cluster_id = '<cluster-ocid>'}
em que:
<namespace-name>
é o nome do namespace criado anteriormente.<service-account-name>
é o nome da conta de serviço criada anteriormente.<cluster-ocid>
é o OCID do cluster obtido anteriormente.
Por exemplo:
Allow any-user to manage objects in tenancy where all { request.principal.type = 'workload', request.principal.namespace = 'finance', request.principal.service_account = 'financeserviceaccount', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd'}
- Clique em Criar para criar a nova política.
- Instale o OCI SDK for Go (consulte SDK para Go).
-
No código do aplicativo Go, adicione:
- o provedor de identidades de carga de trabalho do Kubernetes Engine (
OkeWorkloadIdentityConfigurationProvider
) - o recurso do OCI a ser acessado
Por exemplo, o trecho de código a seguir usa a identidade da carga de trabalho para autenticação, cria um bucket no serviço Object Storage na região Pheonix (PHX) e faz upload de um arquivo para o bucket:
// ExampleObjectStorage_UploadFile shows how to create a bucket and upload a file using OKE Workload Identity func ExampleObjectStorage_UploadFile() { rp, err := auth.OkeWorkloadIdentityConfigurationProvider() if err != nil { panic(err) } c, clerr := objectstorage.NewObjectStorageClientWithConfigurationProvider(rp) c.SetRegion("us-phoenix-1") helpers.FatalIfError(clerr) ctx := context.Background() bname := helpers.GetRandomString(8) namespace := getNamespace(ctx, c) createBucket(ctx, c, namespace, bname) contentlen := 1024 * 1000 filepath, filesize := helpers.WriteTempFileOfSize(int64(contentlen)) filename := path.Base(filepath) defer func() { os.Remove(filename) }() file, e := os.Open(filepath) defer file.Close() helpers.FatalIfError(e) e = putObject(ctx, c, namespace, bname, filename, filesize, file, nil) helpers.FatalIfError(e) // Output: // get namespace // create bucket // put object
- o provedor de identidades de carga de trabalho do Kubernetes Engine (
- Abra a especificação de implantação do aplicativo em um editor de texto e:
- Adicione
serviceAccountName
e defina-o como o nome da conta de serviço criada anteriormente. Por exemplo,serviceAccountName: financeserviceaccount
. - Adicione
automountServiceAccountToken
e defina-o comotrue
.
Por exemplo:
apiVersion: v1 kind: Pod metadata: name: nginx spec: serviceAccountName: financeserviceaccount automountServiceAccountToken: true containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
- Adicione
- Implante o aplicativo digitando:
kubectl create -f <filename>
Por exemplo:kubectl create -f financeworkloadidentity.yaml
Exemplo: Usando o Java SDK para Conceder às Cargas de Trabalho do Aplicativo Acesso aos Recursos do OCI
Para conceder às cargas de trabalho do aplicativo Java em execução em um cluster do Kubernetes acesso a outros recursos do OCI:
-
Se você ainda não tiver feito isso, siga as etapas para configurar o arquivo de configuração kubeconfig do cluster e (se necessário) defina a variável de ambiente KUBECONFIG para apontar para o arquivo. Observe que você deve configurar seu próprio arquivo kubeconfig. Não é possível acessar um cluster usando um arquivo kubeconfig que outro usuário tenha configurado. Consulte Configurando o Acesso ao Cluster.
- Obtenha o OCID do cluster (por exemplo, usando a guia Detalhes do Cluster na Console).
-
Crie um namespace para a conta de serviço do Kubernetes a ser usada digitando:
kubectl create namespace <namespace-name>
Por exemplo:
kubectl create namespace finance
- Crie uma conta de serviço do Kubernetes para o aplicativo usar digitando:
kubectl create serviceaccount <service-account-name> --namespace <namespace-name>
Por exemplo:
kubectl create serviceaccount financeserviceaccount --namespace finance
- Defina uma política de IAM para permitir que a carga de trabalho acesse os recursos necessários do OCI:
- Abra o menu de navegação e clique em Identidade e Segurança. Em Identidade, clique em Políticas.
- Siga as instruções em Para criar uma política e dê um nome à política (por exemplo,
acme-oke-finance-workload-policy
). -
Digite uma instrução de política para permitir que a carga de trabalho acesse os recursos necessários do OCI, no formato:
Allow any-user to <verb> <resource> in <location> where all { request.principal.type = 'workload', request.principal.namespace = '<namespace-name>', request.principal.service_account = '<service-account-name>', request.principal.cluster_id = '<cluster-ocid>'}
em que:
<namespace-name>
é o nome do namespace criado anteriormente.<service-account-name>
é o nome da conta de serviço criada anteriormente.<cluster-ocid>
é o OCID do cluster obtido anteriormente.
Por exemplo:
Allow any-user to manage objects in tenancy where all { request.principal.type = 'workload', request.principal.namespace = 'finance', request.principal.service_account = 'financeserviceaccount', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd'}
- Clique em Criar para criar a nova política.
- Instale o OCI SDK for Java (consulte SDK for Java).
- No pom.xml do aplicativo, adicione o artefato
oci-java-sdk-addons-oke-workload-identity
como uma dependência:
Observe que a versão do SDK deve ser 2.54.0 ou posterior.<dependency> <groupId>com.oracle.oci.sdk</groupId> <artifactId>oci-java-sdk-addons-oke-workload-identity</artifactId> <version>2.54.0</version> </dependency> <dependency> <groupId>com.oracle.oci.sdk</groupId> <artifactId>oci-java-sdk-common</artifactId> <version>2.54.0</version> </dependency>
- No código do seu aplicativo Java, adicione:
- o provedor de identidades de carga de trabalho do Kubernetes Engine (
OkeWorkloadIdentityAuthenticationDetailsProvider
) - o recurso do OCI a ser acessado
Por exemplo, o trecho de código a seguir usa a identidade da carga de trabalho para autenticação, cria um bucket no serviço Object Storage na região Pheonix (PHX) e faz upload de um arquivo para o bucket:
import com.oracle.bmc.Region; import com.oracle.bmc.auth.AuthenticationDetailsProvider; import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider; import com.oracle.bmc.auth.okeworkloadidentity.OkeWorkloadIdentityAuthenticationDetailsProvider; import com.oracle.bmc.objectstorage.ObjectStorage; import com.oracle.bmc.objectstorage.ObjectStorageClient; import com.oracle.bmc.objectstorage.model.BucketSummary; import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest; import com.oracle.bmc.objectstorage.requests.GetObjectRequest; import com.oracle.bmc.objectstorage.requests.ListBucketsRequest; import com.oracle.bmc.objectstorage.requests.ListBucketsRequest.Builder; import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse; import com.oracle.bmc.objectstorage.responses.GetObjectResponse; import com.oracle.bmc.objectstorage.responses.ListBucketsResponse; import java.io.InputStream; public class ObjectStorageSyncExample { public static void main(String[] args) throws Exception { /* Config the Container Engine for Kubernetes workload identity provider */ final OkeWorkloadIdentityAuthenticationDetailsProvider provider = new OkeWorkloadIdentityAuthenticationDetailsProvider .OkeWorkloadIdentityAuthenticationDetailsProviderBuilder() .build(); /* Configure the client to use workload identity provider*/ ObjectStorage client = ObjectStorageClient.builder().region(Region.US_PHOENIX_1).build(provider); GetNamespaceResponse namespaceResponse = client.getNamespace(GetNamespaceRequest.builder().build()); String namespaceName = namespaceResponse.getValue(); System.out.println("Using namespace: " + namespaceName); Builder listBucketsBuilder = ListBucketsRequest.builder() .namespaceName(namespaceName) .compartmentId("enter tenancy id"); String nextToken = null; do { listBucketsBuilder.page(nextToken); ListBucketsResponse listBucketsResponse = client.listBuckets(listBucketsBuilder.build()); for (BucketSummary bucket : listBucketsResponse.getItems()) { System.out.println("Found bucket: " + bucket.getName()); } nextToken = listBucketsResponse.getOpcNextPage(); } while (nextToken != null); // fetch the file from the object storage String bucketName = null; String objectName = null; GetObjectResponse getResponse = client.getObject( GetObjectRequest.builder() .namespaceName(namespaceName) .bucketName(bucketName) .objectName(objectName) .build()); // stream contents should match the file uploaded try (final InputStream fileStream = getResponse.getInputStream()) { // use fileStream } // try-with-resources automatically closes fileStream client.close(); } }
- o provedor de identidades de carga de trabalho do Kubernetes Engine (
- Abra a especificação de implantação do aplicativo em um editor de texto e:
- Adicione
serviceAccountName
e defina-o como o nome da conta de serviço criada anteriormente. Por exemplo,serviceAccountName: financeserviceaccount
. - Adicione
automountServiceAccountToken
e defina-o comotrue
.
Por exemplo:
apiVersion: v1 kind: Pod metadata: name: nginx spec: serviceAccountName: financeserviceaccount automountServiceAccountToken: true containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
- Adicione
- Implante o aplicativo digitando:
kubectl create -f <filename>
Por exemplo:kubectl create -f financeworkloadidentity.yaml
Exemplo: Usando o Java SDK para Conceder às Cargas de Trabalho do Aplicativo Acesso aos Recursos do OCI em Diferentes Compartimentos
Para conceder às cargas de trabalho do aplicativo Java em execução em um cluster do Kubernetes em um compartimento acesso a outros recursos do OCI em outro compartimento:
-
Se você ainda não tiver feito isso, siga as etapas para configurar o arquivo de configuração kubeconfig do cluster e (se necessário) defina a variável de ambiente KUBECONFIG para apontar para o arquivo. Observe que você deve configurar seu próprio arquivo kubeconfig. Não é possível acessar um cluster usando um arquivo kubeconfig que outro usuário tenha configurado. Consulte Configurando o Acesso ao Cluster.
- Obtenha o OCID do cluster (por exemplo, usando a guia Detalhes do Cluster na Console).
- Como administrador do cluster, crie um namespace para a conta de serviço do Kubernetes a ser usada digitando:
kubectl create namespace <namespace-name>
Por exemplo:
kubectl create namespace finance
-
Como administrador do cluster, crie uma conta de serviço do Kubernetes para o aplicativo usar digitando:
kubectl create serviceaccount <service-account-name> --namespace <namespace-name>
Por exemplo:
kubectl create serviceaccount financeserviceaccount --namespace finance
-
Como administrador da tenancy, defina uma política de IAM para permitir que um administrador de cluster vincule cargas de trabalho em execução em um cluster de um compartimento a outros recursos do OCI em outro compartimento:
- Abra o menu de navegação e clique em Identidade e Segurança. Em Identidade, clique em Políticas.
- Siga as instruções em Para criar uma política e dê um nome à política (por exemplo,
acme-oke-finance-workload-policy
). Digite instruções de política para permitir que um administrador de cluster vincule cargas de trabalho em execução em um cluster de um compartimento a outros recursos do OCI em outro compartimento, no formato:
Allow group cluster-admins to manage cluster-workload-mappings in compartment <compartment-one> Allow group cluster-admins to {CLUSTER_WORKLOAD_COMPARTMENT_BIND,CLUSTER_WORKLOAD_COMPARTMENT_UNBIND} in compartment <compartment-two>
em que:
<compartment-one>
é o compartimento ao qual o cluster pertence<compartment-two>
é o compartimento ao qual os outros recursos do OCI pertencem
Por exemplo:
Observe que, se um grupo não estiver no domínio de identidades padrão, coloque o nome do grupo no formatoAllow group cluster-admins to manage cluster-workload-mappings in compartment finance Allow group cluster-admins to {CLUSTER_WORKLOAD_COMPARTMENT_BIND,CLUSTER_WORKLOAD_COMPARTMENT_UNBIND} in compartment sales
group '<identity-domain-name>'/'group-name'
como prefixo. Você também pode especificar um grupo usando seu OCID, no formatogroup id <group-ocid>
.- Clique em Criar para criar a nova política.
-
Como administrador do cluster, no compartimento ao qual o cluster pertence, crie um mapeamento de carga de trabalho que mapeie as cargas de trabalho em execução no cluster para o compartimento ao qual os outros recursos do OCI pertencem:
oci ce workload-mapping create --namespace <namespace-name> --mapped-compartment-id <compartment-two-ocid> --cluster-id <cluster-ocid>
Por exemplo:
oci ce workload-mapping create --namespace finance --mapped-compartment-id ocid1.compartment.oc1..aaaaaaaaad______fda --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd
-
Como administrador do recurso no segundo compartimento, defina uma política do serviço IAM para permitir que a carga de trabalho acesse os recursos do OCI no compartimento:
- Abra o menu de navegação e clique em Identidade e Segurança. Em Identidade, clique em Políticas.
- Siga as instruções em Para criar uma política e dê um nome à política (por exemplo,
acme-oke-finance-workload-policy
). -
Digite uma instrução de política para permitir que a carga de trabalho acesse os recursos necessários do OCI, no formato:
Allow any-user to <verb> <resource> in <location> where all { request.principal.type = 'workload', request.principal.namespace = '<namespace-name>', request.principal.service_account = '<service-account-name>', request.principal.cluster_id = '<cluster-ocid>'}
em que:
<namespace-name>
é o nome do namespace criado anteriormente.<service-account-name>
é o nome da conta de serviço criada anteriormente.<cluster-ocid>
é o OCID do cluster obtido anteriormente.
Por exemplo:
Allow any-user to manage objects in compartment sales where all { request.principal.type = 'workload', request.principal.namespace = 'finance', request.principal.service_account = 'financeserviceaccount', request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd'}
- Clique em Criar para criar a nova política.
- Instale o OCI SDK for Java (consulte SDK for Java). Observe que a versão do SDK deve ser 2.66.0 ou posterior (ou 3.18.0 ou posterior).
- No pom.xml do aplicativo, adicione o artefato
oci-java-sdk-addons-oke-workload-identity
como uma dependência:
Observe que a versão do SDK deve ser 2.66.0 ou posterior (ou 3.18.0 ou posterior).<dependency> <groupId>com.oracle.oci.sdk</groupId> <artifactId>oci-java-sdk-addons-oke-workload-identity</artifactId> <version>2.66.0</version> </dependency> <dependency> <groupId>com.oracle.oci.sdk</groupId> <artifactId>oci-java-sdk-common</artifactId> <version>2.66.0</version> </dependency>
- No código do seu aplicativo Java, adicione:
- o provedor de identidades de carga de trabalho do Kubernetes Engine (
OkeWorkloadIdentityAuthenticationDetailsProvider
) - o recurso do OCI a ser acessado
Por exemplo, o trecho de código a seguir usa a identidade da carga de trabalho para autenticação, cria um bucket no serviço Object Storage na região Pheonix (PHX) e faz upload de um arquivo para o bucket:
import com.oracle.bmc.Region; import com.oracle.bmc.auth.AuthenticationDetailsProvider; import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider; import com.oracle.bmc.auth.okeworkloadidentity.OkeWorkloadIdentityAuthenticationDetailsProvider; import com.oracle.bmc.objectstorage.ObjectStorage; import com.oracle.bmc.objectstorage.ObjectStorageClient; import com.oracle.bmc.objectstorage.model.BucketSummary; import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest; import com.oracle.bmc.objectstorage.requests.GetObjectRequest; import com.oracle.bmc.objectstorage.requests.ListBucketsRequest; import com.oracle.bmc.objectstorage.requests.ListBucketsRequest.Builder; import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse; import com.oracle.bmc.objectstorage.responses.GetObjectResponse; import com.oracle.bmc.objectstorage.responses.ListBucketsResponse; import java.io.InputStream; public class ObjectStorageSyncExample { public static void main(String[] args) throws Exception { /* Config the Container Engine for Kubernetes workload identity provider */ final OkeWorkloadIdentityAuthenticationDetailsProvider provider = new OkeWorkloadIdentityAuthenticationDetailsProvider .OkeWorkloadIdentityAuthenticationDetailsProviderBuilder() .build(); /* Configure the client to use workload identity provider*/ ObjectStorage client = ObjectStorageClient.builder().region(Region.US_PHOENIX_1).build(provider); GetNamespaceResponse namespaceResponse = client.getNamespace(GetNamespaceRequest.builder().build()); String namespaceName = namespaceResponse.getValue(); System.out.println("Using namespace: " + namespaceName); Builder listBucketsBuilder = ListBucketsRequest.builder() .namespaceName(namespaceName) .compartmentId("enter tenancy id"); String nextToken = null; do { listBucketsBuilder.page(nextToken); ListBucketsResponse listBucketsResponse = client.listBuckets(listBucketsBuilder.build()); for (BucketSummary bucket : listBucketsResponse.getItems()) { System.out.println("Found bucket: " + bucket.getName()); } nextToken = listBucketsResponse.getOpcNextPage(); } while (nextToken != null); // fetch the file from the object storage String bucketName = null; String objectName = null; GetObjectResponse getResponse = client.getObject( GetObjectRequest.builder() .namespaceName(namespaceName) .bucketName(bucketName) .objectName(objectName) .build()); // stream contents should match the file uploaded try (final InputStream fileStream = getResponse.getInputStream()) { // use fileStream } // try-with-resources automatically closes fileStream client.close(); } }
- o provedor de identidades de carga de trabalho do Kubernetes Engine (
- Abra a especificação de implantação do aplicativo em um editor de texto e:
- Adicione
namespace
e defina-o com o nome do namespace criado anteriormente. Por exemplo,namespace: finance
. - Adicione
serviceAccountName
e defina-o como o nome da conta de serviço criada anteriormente. Por exemplo,serviceAccountName: financeserviceaccount
. - Adicione
automountServiceAccountToken
e defina-o comotrue
.
Por exemplo:
apiVersion: v1 kind: Pod metadata: name: nginx namespace: finance spec: serviceAccountName: financeserviceaccount automountServiceAccountToken: true containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
- Adicione
- Implante o aplicativo digitando:
kubectl create -f <filename>
Por exemplo:kubectl create -f financeworkloadidentity.yaml