> ## 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.

# Permisos de red

> Cada acción de IAM que el servicio de red comprueba, qué recurso se comprueba cada uno, y los tres lugares en los que una política es más amplia o estrecha de lo que parece.

Los endpoints de red requieren las acciones de IAM que se indican a continuación. Algunas lecturas comprueban tanto el recurso solicitado como sus recursos relacionados.

<Info>
  La referencia de la API muestra la acción en la página propia de cada punto final, por lo que no tiene que volver aquí para buscar una. Ambos provienen del mismo lugar: la llamada de autorización en el servicio, leída en el momento de la compilación.
</Info>

<a id="resource-shapes" />

## Formas de recursos

Diez tipos de recursos, y la diferencia entre ellos decide lo que una política puede decir:

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

Las rutas y las IP flotantes no tienen nombre propio, por lo que son las dos que no pueden nombrarse de forma legible en una directiva. Condición en las etiquetas para ellos.

La ranura de región está **poblada**. Una VPC existe en una región, por lo que una política escrita para una región no llega a otra, y `crn:network:*:…` es la forma de escribir una que las abarque deliberadamente.

<a id="the-actions" />

## Las acciones

| Acción y aventura | Llamada de teléfono | Comprobado contra |
| - | - | - |
| `network:ListVPCs` | `GET /v1/vpcs` | `vpc/*` |
| `network:CreateVPC` | `POST /v1/vpcs` | el nuevo CRN de VPC |
| `network:GetVPC` | `GET /v1/vpcs/{vpc_id}` | el VPC |
| `network:GetVPC` | `GET /v1/vpcs/{vpc_id}/prefix-pools` | el VPC |
| `network:UpdateVPC` | `POST /v1/vpcs/{vpc_id}/prefix-pools`, `DELETE /v1/vpcs/{vpc_id}/prefix-pools/{pool_id}` | el VPC |
| `network:UpdateVPC` | `PATCH /v1/vpcs/{vpc_id}` | el VPC |
| `network:DeleteVPC` | `DELETE /v1/vpcs/{vpc_id}` | el VPC |
| `network:ListSubnets` | `GET /v1/subnets` | `subnet/*` |
| `network:CreateSubnet` | `POST /v1/subnets` | el CRN de la nueva subred |
| `network:GetSubnet` | `GET /v1/subnets/{subnet_id}` | la subred |
| `network:UpdateSubnet` | `PATCH /v1/subnets/{subnet_id}` | la subred |
| `network:DeleteSubnet` | `DELETE /v1/subnets/{subnet_id}` | la subred |
| `network:ListInterfaces` | `GET /v1/interfaces` | `interface/*` |
| `network:CreateInterface` | `POST /v1/interfaces` | el CRN de la nueva interfaz |
| `network:GetInterface` | `GET /v1/interfaces/{interface_id}` | la interfaz |
| `network:GetInterface` | `GET /v1/interfaces/{interface_id}/addresses`, `GET /v1/interfaces/{interface_id}/prefixes` | la interfaz |
| `network:UpdateInterface` | `POST /v1/interfaces/{interface_id}/addresses`, `DELETE /v1/interfaces/{interface_id}/addresses/{address_id}` | la interfaz |
| `network:UpdateInterface` | `POST /v1/interfaces/{interface_id}/prefixes`, `DELETE /v1/interfaces/{interface_id}/prefixes/{prefix_id}` | la interfaz |
| `network:UpdateInterface` | `PATCH /v1/interfaces/{interface_id}` | la interfaz |
| `network:DeleteInterface` | `DELETE /v1/interfaces/{interface_id}` | la interfaz |
| `network:ListInterfaceSecurityGroups` | `GET /v1/interfaces/{interface_id}/security-groups` | la interfaz |
| `network:SetInterfaceSecurityGroups` | `PUT /v1/interfaces/{interface_id}/security-groups` | la interfaz |
| `network:ListRouteTables` | `GET /v1/route-tables` | `route-table/*` |
| `network:CreateRouteTable` | `POST /v1/route-tables` | el CRN de la nueva tabla |
| `network:GetRouteTable` | `GET /v1/route-tables/{route_table_id}` | la mesa |
| `network:UpdateRouteTable` | `PATCH /v1/route-tables/{route_table_id}` | la mesa |
| `network:DeleteRouteTable` | `DELETE /v1/route-tables/{route_table_id}` | la mesa |
| `network:ListRoutes` | `GET /v1/route-tables/{route_table_id}/routes` | la **mesa** |
| `network:CreateRoute` | `POST /v1/route-tables/{route_table_id}/routes` | la **mesa** |
| `network:GetRoute` | `GET /v1/route-tables/{route_table_id}/routes/{route_id}` | la ruta |
| `network:UpdateRoute` | `PATCH /v1/route-tables/{route_table_id}/routes/{route_id}` | la ruta |
| `network:DeleteRoute` | `DELETE /v1/route-tables/{route_table_id}/routes/{route_id}` | la ruta |
| `network:ListSecurityGroups` | `GET /v1/security-groups` | `security-group/*` |
| `network:CreateSecurityGroup` | `POST /v1/security-groups` | el CRN del nuevo grupo |
| `network:GetSecurityGroup` | `GET /v1/security-groups/{security_group_id}` | el grupo |
| `network:UpdateSecurityGroup` | `PATCH /v1/security-groups/{security_group_id}` | el grupo |
| `network:DeleteSecurityGroup` | `DELETE /v1/security-groups/{security_group_id}` | el grupo |
| `network:ListSecurityGroupRules` | `GET /v1/security-groups/{security_group_id}/rules` | el **grupo** |
| `network:CreateSecurityGroupRule` | `POST /v1/security-groups/{security_group_id}/rules` | el **grupo** |
| `network:GetSecurityGroupRule` | `GET /v1/security-groups/{security_group_id}/rules/{rule_id}` | el **grupo** |
| `network:DeleteSecurityGroupRule` | `DELETE /v1/security-groups/{security_group_id}/rules/{rule_id}` | el **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}` | la dirección |
| `network:UpdateFloatingIP` | `PATCH /v1/floating-ips/{floating_ip_id}` | la dirección |
| `network:DeleteFloatingIP` | `DELETE /v1/floating-ips/{floating_ip_id}` | la dirección |
| `network:AttachFloatingIP` | `POST /v1/floating-ips/{floating_ip_id}/attach` | la dirección |
| `network:DetachFloatingIP` | `POST /v1/floating-ips/{floating_ip_id}/detach` | la dirección |
| `network:ListInternetGateways` | `GET /v1/internet-gateways` | `internet-gateway/*` |
| `network:CreateInternetGateway` | `POST /v1/internet-gateways` | el CRN de la nueva pasarela |
| `network:GetInternetGateway` | `GET /v1/internet-gateways/{internet_gateway_id}` | la puerta de entrada |
| `network:GetInternetGateway` y `network:ListRoutes` | `GET /v1/internet-gateways/{internet_gateway_id}/routes` | la puerta de enlace, luego cada tabla propietaria |
| `network:UpdateInternetGateway` | `PATCH /v1/internet-gateways/{internet_gateway_id}` | la puerta de entrada |
| `network:DeleteInternetGateway` | `DELETE /v1/internet-gateways/{internet_gateway_id}` | la puerta de entrada |
| `network:AttachInternetGateway` | `POST /v1/internet-gateways/{internet_gateway_id}/attach` | la puerta de entrada |
| `network:DetachInternetGateway` | `POST /v1/internet-gateways/{internet_gateway_id}/detach` | la puerta de entrada |
| `network:ListNATGateways` | `GET /v1/nat-gateways` | `nat-gateway/*` |
| `network:CreateNATGateway` | `POST /v1/nat-gateways` | el CRN de la nueva pasarela |
| `network:GetNATGateway` | `GET /v1/nat-gateways/{nat_gateway_id}` | la puerta de entrada |
| `network:GetNATGateway` y `network:ListRoutes` | `GET /v1/nat-gateways/{nat_gateway_id}/routes` | la puerta de enlace, luego cada tabla propietaria |
| `network:UpdateNATGateway` | `PATCH /v1/nat-gateways/{nat_gateway_id}` | la puerta de entrada |
| `network:DeleteNATGateway` | `DELETE /v1/nat-gateways/{nat_gateway_id}` | la puerta de entrada |
| `network:ListEgressOnlyGateways` | `GET /v1/egress-only-gateways` | `egress-only-gateway/*` |
| `network:CreateEgressOnlyGateway` | `POST /v1/egress-only-gateways` | el CRN de la nueva pasarela |
| `network:GetEgressOnlyGateway` | `GET /v1/egress-only-gateways/{egress_only_gateway_id}` | la puerta de entrada |
| `network:GetEgressOnlyGateway` y `network:ListRoutes` | `GET /v1/egress-only-gateways/{egress_only_gateway_id}/routes` | la puerta de enlace, luego cada tabla propietaria |
| `network:UpdateEgressOnlyGateway` | `PATCH /v1/egress-only-gateways/{egress_only_gateway_id}` | la puerta de entrada |
| `network:DeleteEgressOnlyGateway` | `DELETE /v1/egress-only-gateways/{egress_only_gateway_id}` | la puerta de entrada |

Las colecciones de rutas de puerta de enlace filtran por acceso a tabla de rutas. Leer la puerta de enlace por sí sola no concede acceso a sus rutas: `network:ListRoutes` se comprueba contra el CRN y las etiquetas de recursos de cada tabla. Las tablas denegadas se omiten antes de la paginación y la respuesta incluye solo identidades de tabla de rutas visibles.

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

## La creación se verifica con el nombre que has solicitado

Una creación se autoriza contra el CRN del recurso *a punto de existir*, construido a partir del nombre en la solicitud. Así que una convención de nombres es exigible:

```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/*"
      ]
    }
  ]
}
```

Una petición llamada `team-b-web` es denegada antes de que se escriba nada. Las `tags` propias de la solicitud también están disponibles como contexto de condición en un create, a través de `basalt:RequestTag/<key>`, por lo que puede requerir una etiqueta de equipo en la misma sentencia.

<Warning>
  Un CRN tiene un ámbito de cuenta, pero **los nombres de subred son únicos por VPC** y **los nombres de interfaz por subred**. Por lo tanto, `subnet/web` en una política coincide con una subred llamada `web` en *todas* las VPC de la cuenta, no solo en la que tenías en mente, y la misma convención en dos VPC se reduce a un ámbito de política.

  Cuando necesite cercar las subredes de una sola VPC, condicione una etiqueta con
  `basalt:ResourceTag/<key>` En lugar de confiar en el nombre.
</Warning>

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

## Las colecciones de nivel superior usan permisos de comodín

Las listas de recursos de nivel superior se autorizan contra el comodín de la colección, literalmente `crn:network:<region>:<account>:vpc/*`, no contra cada fila. Un recurso de política de `vpc/prod-*` no coincide con esa cadena, por lo que restringir una lista por patrón de nombre no la restringe, sino que la **niega por completo**:

| 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 |

Así que concede el comodín para listar y abarcar las operaciones que *actúan* en un recurso. La lista le dice a la persona que llama que algo existe y nada más.

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

## Los subrecursos se rigen por su padre, en su mayoría

Las reglas de grupo de seguridad no tienen CRN propio. Las cuatro acciones de regla (lista, crear, obtener y eliminar) se comparan con el CRN del **grupo principal** con las etiquetas del grupo como contexto. Por lo tanto, conceder `network:CreateSecurityGroupRule` a un grupo es exactamente tan estrecho como lo lee, y una condición de etiqueta en el grupo gobierna quién puede agregar reglas a él.

Las rutas son la excepción, y la división vale la pena conocer:

<Tabs>
  <Tab title="Comprobado contra la mesa">
    `network:ListRoutes` y `network:CreateRoute` están autorizados contra el CRN y las etiquetas de la tabla de **rutas**. Esto es lo que le permite conceder "puede agregar rutas a la tabla privada" sin concederlo en `*`.
  </Tab>

  <Tab title="Comprobado contra la ruta">
    `network:GetRoute`, `network:UpdateRoute` y `network:DeleteRoute` están autorizados contra el CRN de la **ruta** `route/<id>`, con las etiquetas de la ruta.

    Debido a que el CRN de una ruta se define por id, una política no puede nombrarlo de forma legible. Etiquete sus rutas si necesita distinguirlas — un `deny` en `basalt:ResourceTag/protected` es la forma práctica de evitar que una ruta predeterminada sea borrada.
  </Tab>
</Tabs>

<Note>
  Una concesión para crear rutas en una tabla es similar a una concesión para cambiar dónde las subredes de esa tabla envían tráfico. Alguien que puede añadir `0.0.0.0/0` a la tabla de una subred privada la ha hecho pública — no se requiere ningún cambio de gateway ni de grupo de seguridad, porque la gateway ya estaba conectada.
</Note>

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

## La membresía de interfaz es una acción, no dos

`network:SetInterfaceSecurityGroups` cubre tanto la conexión como la desconexión, porque el punto final es un `PUT` que reemplaza todo el conjunto. No hay una acción de desconexión separada que retener: cualquiera que pueda agregar un grupo a una interfaz puede eliminar todos los grupos de ella, lo que deja que esa interfaz deje de recibir todo el tráfico.

Concederlo en las interfaces que un llamador está destinado a gestionar, no en `interface/*`.

<a id="next" />

## Siguiente

<CardGroup cols={2}>
  <Card title="Políticas" icon="file-text" href="/es/iam/policies">
    Estructura del documento, condiciones y cómo se evalúa `deny`.
  </Card>

  <Card title="Solución de problemas" icon="life-buoy" href="/es/networking/troubleshooting">
    Lo que significa cada rechazo, y el orden en que las cosas tienen que desmoronarse.
  </Card>
</CardGroup>


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