> ## Documentation Index
> Fetch the complete documentation index at: https://docs.basaltic.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Permissões de rede

> Cada ação do IAM que o serviço de rede verifica, qual recurso cada um é verificado e os três lugares em que uma política é mais ampla ou mais estreita do que parece.

Os endpoints de rede exigem as ações do IAM abaixo. Algumas leituras verificam tanto o recurso solicitado quanto seus recursos relacionados.

<Info>
  A referência da API mostra a ação na própria página de cada ponto de extremidade, para que você não precise voltar aqui para procurar uma. Ambos vêm do mesmo lugar: a chamada de autorização no serviço, lida no momento da compilação.
</Info>

<a id="resource-shapes" />

## Formas de recurso

Dez tipos de recursos, e a diferença entre eles decide o que uma política pode dizer:

| CRN | Chaveado por |
| - | - |
| `crn:network:<region>:<account>:vpc/<name>` | nome |
| `crn:network:<region>:<account>:vpc/<vpc>/subnet/<name>` | nome |
| `crn:network:<region>:<account>:vpc/<vpc>/subnet/<subnet>/interface/<name>` | nome |
| `crn:network:<region>:<account>:vpc/<vpc>/route-table/<name>` | nome |
| `crn:network:<region>:<account>:security-group/<name>` | nome |
| `crn:network:<region>:<account>:internet-gateway/<name>` | nome |
| `crn:network:<region>:<account>:nat-gateway/<name>` | nome |
| `crn:network:<region>:<account>:egress-only-gateway/<name>` | nome |
| `crn:network:<region>:<account>:route/<id>` | id |
| `crn:network:<region>:<account>:floating-ip/<id>` | id |

As rotas e os IPs flutuantes não têm nome próprio, portanto, são os dois que não podem ser nomeados de forma legível em uma política. Condição em tags para aqueles.

O slot da região está **populado**. Uma VPC existe em uma região, então uma política escrita para uma região não alcança outra — e `crn:network:*:…` é como você escreve uma que as abrange deliberadamente.

<a id="the-actions" />

## As ações

| Ação e aventura | Chamada de telefone | Verificado contra |
| - | - | - |
| `network:ListVPCs` | `GET /v1/vpcs` | `vpc/*` |
| `network:CreateVPC` | `POST /v1/vpcs` | o novo CRN do VPC |
| `network:GetVPC` | `GET /v1/vpcs/{vpc_id}` | o VPC |
| `network:GetVPC` | `GET /v1/vpcs/{vpc_id}/prefix-pools` | o VPC |
| `network:UpdateVPC` | `POST /v1/vpcs/{vpc_id}/prefix-pools`, `DELETE /v1/vpcs/{vpc_id}/prefix-pools/{pool_id}` | o VPC |
| `network:UpdateVPC` | `PATCH /v1/vpcs/{vpc_id}` | o VPC |
| `network:DeleteVPC` | `DELETE /v1/vpcs/{vpc_id}` | o VPC |
| `network:ListSubnets` | `GET /v1/subnets` | `subnet/*` |
| `network:CreateSubnet` | `POST /v1/subnets` | o CRN da nova sub-rede |
| `network:GetSubnet` | `GET /v1/subnets/{subnet_id}` | a sub-rede |
| `network:UpdateSubnet` | `PATCH /v1/subnets/{subnet_id}` | a sub-rede |
| `network:DeleteSubnet` | `DELETE /v1/subnets/{subnet_id}` | a sub-rede |
| `network:ListInterfaces` | `GET /v1/interfaces` | `interface/*` |
| `network:CreateInterface` | `POST /v1/interfaces` | o CRN da nova interface |
| `network:GetInterface` | `GET /v1/interfaces/{interface_id}` | a interface |
| `network:GetInterface` | `GET /v1/interfaces/{interface_id}/addresses`, `GET /v1/interfaces/{interface_id}/prefixes` | a interface |
| `network:UpdateInterface` | `POST /v1/interfaces/{interface_id}/addresses`, `DELETE /v1/interfaces/{interface_id}/addresses/{address_id}` | a interface |
| `network:UpdateInterface` | `POST /v1/interfaces/{interface_id}/prefixes`, `DELETE /v1/interfaces/{interface_id}/prefixes/{prefix_id}` | a interface |
| `network:UpdateInterface` | `PATCH /v1/interfaces/{interface_id}` | a interface |
| `network:DeleteInterface` | `DELETE /v1/interfaces/{interface_id}` | a interface |
| `network:ListInterfaceSecurityGroups` | `GET /v1/interfaces/{interface_id}/security-groups` | a interface |
| `network:SetInterfaceSecurityGroups` | `PUT /v1/interfaces/{interface_id}/security-groups` | a interface |
| `network:ListRouteTables` | `GET /v1/route-tables` | `route-table/*` |
| `network:CreateRouteTable` | `POST /v1/route-tables` | o CRN da nova tabela |
| `network:GetRouteTable` | `GET /v1/route-tables/{route_table_id}` | a mesa |
| `network:UpdateRouteTable` | `PATCH /v1/route-tables/{route_table_id}` | a mesa |
| `network:DeleteRouteTable` | `DELETE /v1/route-tables/{route_table_id}` | a mesa |
| `network:ListRoutes` | `GET /v1/route-tables/{route_table_id}/routes` | a **tabela** |
| `network:CreateRoute` | `POST /v1/route-tables/{route_table_id}/routes` | a **tabela** |
| `network:GetRoute` | `GET /v1/route-tables/{route_table_id}/routes/{route_id}` | a rota |
| `network:UpdateRoute` | `PATCH /v1/route-tables/{route_table_id}/routes/{route_id}` | a rota |
| `network:DeleteRoute` | `DELETE /v1/route-tables/{route_table_id}/routes/{route_id}` | a rota |
| `network:ListSecurityGroups` | `GET /v1/security-groups` | `security-group/*` |
| `network:CreateSecurityGroup` | `POST /v1/security-groups` | o CRN do novo grupo |
| `network:GetSecurityGroup` | `GET /v1/security-groups/{security_group_id}` | o grupo |
| `network:UpdateSecurityGroup` | `PATCH /v1/security-groups/{security_group_id}` | o grupo |
| `network:DeleteSecurityGroup` | `DELETE /v1/security-groups/{security_group_id}` | o grupo |
| `network:ListSecurityGroupRules` | `GET /v1/security-groups/{security_group_id}/rules` | o **grupo** |
| `network:CreateSecurityGroupRule` | `POST /v1/security-groups/{security_group_id}/rules` | o **grupo** |
| `network:GetSecurityGroupRule` | `GET /v1/security-groups/{security_group_id}/rules/{rule_id}` | o **grupo** |
| `network:DeleteSecurityGroupRule` | `DELETE /v1/security-groups/{security_group_id}/rules/{rule_id}` | o **grupo** |
| `network:ListFloatingIPs` | `GET /v1/floating-ips` | `floating-ip/*` |
| `network:CreateFloatingIP` | `POST /v1/floating-ips` | `floating-ip/*` |
| `network:GetFloatingIP` | `GET /v1/floating-ips/{floating_ip_id}` | o endereço |
| `network:UpdateFloatingIP` | `PATCH /v1/floating-ips/{floating_ip_id}` | o endereço |
| `network:DeleteFloatingIP` | `DELETE /v1/floating-ips/{floating_ip_id}` | o endereço |
| `network:AttachFloatingIP` | `POST /v1/floating-ips/{floating_ip_id}/attach` | o endereço |
| `network:DetachFloatingIP` | `POST /v1/floating-ips/{floating_ip_id}/detach` | o endereço |
| `network:ListInternetGateways` | `GET /v1/internet-gateways` | `internet-gateway/*` |
| `network:CreateInternetGateway` | `POST /v1/internet-gateways` | o CRN do novo gateway |
| `network:GetInternetGateway` | `GET /v1/internet-gateways/{internet_gateway_id}` | o portal |
| `network:GetInternetGateway` e `network:ListRoutes` | `GET /v1/internet-gateways/{internet_gateway_id}/routes` | o gateway, então cada tabela proprietária |
| `network:UpdateInternetGateway` | `PATCH /v1/internet-gateways/{internet_gateway_id}` | o portal |
| `network:DeleteInternetGateway` | `DELETE /v1/internet-gateways/{internet_gateway_id}` | o portal |
| `network:AttachInternetGateway` | `POST /v1/internet-gateways/{internet_gateway_id}/attach` | o portal |
| `network:DetachInternetGateway` | `POST /v1/internet-gateways/{internet_gateway_id}/detach` | o portal |
| `network:ListNATGateways` | `GET /v1/nat-gateways` | `nat-gateway/*` |
| `network:CreateNATGateway` | `POST /v1/nat-gateways` | o CRN do novo gateway |
| `network:GetNATGateway` | `GET /v1/nat-gateways/{nat_gateway_id}` | o portal |
| `network:GetNATGateway` e `network:ListRoutes` | `GET /v1/nat-gateways/{nat_gateway_id}/routes` | o gateway, então cada tabela proprietária |
| `network:UpdateNATGateway` | `PATCH /v1/nat-gateways/{nat_gateway_id}` | o portal |
| `network:DeleteNATGateway` | `DELETE /v1/nat-gateways/{nat_gateway_id}` | o portal |
| `network:ListEgressOnlyGateways` | `GET /v1/egress-only-gateways` | `egress-only-gateway/*` |
| `network:CreateEgressOnlyGateway` | `POST /v1/egress-only-gateways` | o CRN do novo gateway |
| `network:GetEgressOnlyGateway` | `GET /v1/egress-only-gateways/{egress_only_gateway_id}` | o portal |
| `network:GetEgressOnlyGateway` e `network:ListRoutes` | `GET /v1/egress-only-gateways/{egress_only_gateway_id}/routes` | o gateway, então cada tabela proprietária |
| `network:UpdateEgressOnlyGateway` | `PATCH /v1/egress-only-gateways/{egress_only_gateway_id}` | o portal |
| `network:DeleteEgressOnlyGateway` | `DELETE /v1/egress-only-gateways/{egress_only_gateway_id}` | o portal |

Coleções de rotas de gateway filtram por acesso de tabela de rotas. Ler o gateway sozinho não concede acesso às suas rotas: `network:ListRoutes` é verificado contra o CRN e as tags de recursos de cada tabela. As tabelas negadas são omitidas antes da paginação e a resposta inclui apenas identidades de tabela de rota visíveis.

<a id="creating-is-checked-against-the-name-you-asked-for" />

## A criação é verificada com o nome que você pediu

Uma criação é autorizada contra o CRN do recurso *about to exist*, construído a partir do nome na solicitação. Assim, uma convenção de nomenclatura é aplicável:

```json theme={null}
{
  "version": "2024-01-01",
  "statement": [
    {
      "effect": "allow",
      "actions": ["network:CreateSubnet", "network:CreateRouteTable"],
      "resources": [
        "crn:network:sa-saopaulo-1:my-account:vpc/team-a-*/subnet/*",
        "crn:network:sa-saopaulo-1:my-account:vpc/team-a-*/route-table/*"
      ]
    }
  ]
}
```

Uma solicitação com o nome `team-b-web` é negada antes que qualquer coisa seja escrita. As próprias `tags` da solicitação estão disponíveis como contexto de condição em um create também, via `basalt:RequestTag/<key>`, para que você possa exigir uma tag de equipe na mesma instrução.

<Warning>
  Um CRN tem escopo de conta, mas **nome de sub-rede é exclusivo por VPC** e **nome de interface por sub-rede**. Assim, `subnet/web` em uma política corresponde a uma sub-rede chamada `web` em *todas* as VPCs da conta, não apenas na que você tinha em mente, e a mesma convenção em duas VPCs se resume a um escopo de política.

  Quando você precisar delimitar as sub-redes de uma única VPC, condicione uma tag com
  `basalt:ResourceTag/<key>` ao invés de confiar no nome.
</Warning>

<a id="top-level-collections-use-wildcard-permissions" />

## Coleções de nível superior usam permissões de curinga

As listas de recursos de nível superior são autorizadas contra o curinga da coleção — literalmente `crn:network:<region>:<account>:vpc/*`, não contra cada linha. Um recurso de política de `vpc/prod-*` não corresponde a essa string, então restringir uma lista pelo padrão de nome não a restringe, ela **nega-a inteiramente**:

| Recurso de política | `ListVPCs` | `GetVPC` on `vpc/prod-web` |
| - | - | - |
| `crn:network:sa-saopaulo-1:my-account:vpc/*` | permitido | permitido |
| `crn:network:sa-saopaulo-1:my-account:vpc/prod-*` | **negado** | permitido |
| `crn:network:*:my-account:vpc/*` | permitido | permitido |

Então conceda o curinga para listar e escopo as operações que *agem* em um recurso. A listagem diz ao chamador que algo existe e nada mais.

<a id="sub-resources-are-governed-by-their-parent-—-mostly" />

## Os sub-recursos são governados pelo seu pai — na maioria das vezes

As regras de grupo de segurança não têm CRN próprio. Todas as quatro ações de regra — lista, crie, obtenha e exclua — são verificadas em relação ao CRN do **grupo pai** com as tags do grupo como contexto. Conceder `network:CreateSecurityGroupRule` em um grupo é, portanto, exatamente tão restrito quanto ele lê, e uma condição de tag no grupo governa quem pode adicionar regras a ele.

As rotas são a exceção, e a divisão vale a pena conhecer:

<Tabs>
  <Tab title="Verificado contra a mesa">
    `network:ListRoutes` e `network:CreateRoute` são autorizados contra o
    **tabela de rotas** Isso é o que permite que você conceda "pode adicionar rotas à tabela privada" sem concedê-lo em um nível de domínio. `*`.
  </Tab>

  <Tab title="Verificado contra a rota">
    `network:GetRoute`, `network:UpdateRoute` e `network:DeleteRoute` são autorizados contra o CRN `route/<id>` próprio da **rota**, com as tags da rota.

    Como o CRN de uma rota é definido por id, uma política não pode nomear um de forma legível. Marque suas rotas se você precisar distingui-las — um `deny` em `basalt:ResourceTag/protected` é a maneira prática de manter uma rota padrão de ser excluída.
  </Tab>
</Tabs>

<Note>
  Uma concessão para criar rotas em uma tabela é semelhante a uma concessão para alterar onde as sub-redes dessa tabela enviam tráfego. Alguém que pode adicionar `0.0.0.0/0` a uma tabela de sub-rede privada a tornou pública — nenhuma mudança de gateway e nenhuma mudança de grupo de segurança necessária, porque o gateway já estava anexado.
</Note>

<a id="interface-membership-is-one-action-not-two" />

## A associação à interface é uma ação, não duas

`network:SetInterfaceSecurityGroups` cobre tanto a conexão quanto a desconexão, porque o ponto final é um `PUT` que substitui todo o conjunto. Não há nenhuma ação de desconexão separada a ser retida: qualquer um que possa adicionar um grupo a uma interface pode remover todos os grupos dela, o que deixa essa interface descartando todo o tráfego.

Conceda-o nas interfaces que um chamador deve gerenciar, não em `interface/*`.

<a id="next" />

## Próximo

<CardGroup cols={2}>
  <Card title="Políticas" icon="file-text" href="/pt/iam/policies">
    Estrutura do documento, condições e como `deny` é avaliado.
  </Card>

  <Card title="Solução de problemas" icon="life-buoy" href="/pt/networking/troubleshooting">
    O que cada recusa significa, e a ordem em que as coisas têm que se desfazer.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.