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

# Grupos de segurança

> Stateful permite regras anexadas a uma interface — a postura padrão, o que uma regra pode nomear e o que a plataforma impõe independentemente.

Um grupo de segurança é um conjunto nomeado de **regras de permissão com estado**. Não há regras de negação e não há ordenação: um pacote é permitido se qualquer regra em qualquer grupo anexado à interface o permitir, e descartado de outra forma.

<Warning>
  As regras não fazem nada até que o grupo seja anexado a uma interface. Um grupo cheio de regras cuidadosamente escritas que nenhuma interface pertence não tem efeito em nenhum lugar.
</Warning>

<CardGroup cols={2}>
  <Card title="A postura padrão" icon="lock" href="#the-default-posture">
    O que uma interface sem grupo faz, e a regra com a qual um novo grupo começa.
  </Card>

  <Card title="Regras de escrita" icon="list-checks" href="#rules">
    Campos obrigatórios, a fonte que não é opcional e por que não há atualização.
  </Card>

  <Card title="Anexar" icon="link" href="#attaching-groups-to-an-interface">
    A associação é um conjunto que você substitui, não uma lista que você acrescenta.
  </Card>

  <Card title="Regras da plataforma" icon="shield-alert" href="#what-the-platform-enforces-regardless">
    Tráfego que é sempre permitido e a porta que é sempre bloqueada.
  </Card>
</CardGroup>

<a id="the-default-posture" />

## A postura padrão

Dois padrões diferentes importam aqui, e confundi-los é a fonte usual de "minhas regras não fazem nada".

<Tabs>
  <Tab title="Uma interface em nenhum grupo">
    **Negar por padrão, ambas as direções.** Todos os pacotes são descartados, exceto quando a própria plataforma sempre ativada permite. Anexar nenhum grupo de segurança não é a opção permissiva — é a opção fechada.
  </Tab>

  <Tab title="Um grupo recém-criado">
    Por padrão, negar ambas as direções, **mais uma regra**: egress, todos os protocolos, para `0.0.0.0/0`. Assim, anexar um novo grupo dá a uma interface todo o IPv4 de saída e nenhum de entrada. Exclua essa regra se você quiser bloquear a saída.
  </Tab>
</Tabs>

<Warning>
  Essa regra de saída padrão é **IPv4 only**. Uma interface de pilha dupla não tem saída `::/0` até que você adicione uma regra de saída `ipv6`, então uma instância habilitada para v6 que funciona sobre IPv4 pode falhar silenciosamente sobre IPv6 com um grupo que parece estar aberto.
</Warning>

<a id="rules" />

## Regras

<Tabs>
  <Tab title="Console">
    Vá para **Networking → Security Groups** — **Create Security Group** cria um, com um **Name** e uma **Description** opcional — depois abra-o e escolha **Add inbound rule** ou **Add outbound rule**. Qual botão você pressionou é a direção da regra; não há nenhum campo de direção na caixa de diálogo, e o bloco onde você nomeia a outra extremidade é encabeçado **Source** ou **Destination** para corresponder.

    Escolha uma predefinição de **Service** — **HTTPS (443)**, **SSH (22)**, **PostgreSQL (5432)** e assim por diante — ou deixe-a em **Custom** e defina **IP
    Version**, **Protocol** e **Port Range** você mesmo. **Port Range** é um campo que toma uma única porta ou um intervalo, onde a API toma `port_min` e `port_max` separadamente. Em seguida, escolha **CIDR** ou **Security
    Group** para a fonte e confirme com **Add Rule**.

    As guias **Inbound** e **Outbound** do grupo listam o que ele contém, cada linha com uma ação **Delete rule**.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    POST /v1/security-groups/{security_group_id}/rules
    {
      "direction": "ingress",
      "protocol": "tcp",
      "port_min": 443,
      "port_max": 443,
      "remote_cidr": "0.0.0.0/0"
    }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic network security-group-rule create <security-group-id> \
      --direction ingress --protocol tcp --port-min 443 --port-max 443 \
      --remote-cidr 0.0.0.0/0
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    rule, err := network.New(cfg).CreateSecurityGroupRule(ctx, securityGroupID,
        &network.SecurityGroupRuleCreateRequest{
            Direction:  "ingress",
            Protocol:   "tcp",
            PortMin:    basaltic.Int(443),
            PortMax:    basaltic.Int(443),
            RemoteCIDR: basaltic.String("0.0.0.0/0"),
        })
    ```
  </Tab>
</Tabs>

<ResponseField name="direction" type="ingress | egress" required>
  Para uma regra `egress`, `remote_cidr` e `source_security_group_id` nomeiam o **destination**. Os nomes dos campos não mudam com a direção.
</ResponseField>

<ResponseField name="protocol" type="tcp | udp | icmp | all" required />

<ResponseField name="ethertype" type="ipv4 | ipv6">
  Padrões para `ipv4`. Uma regra corresponde a apenas uma família; escreva duas regras para ambas.
</ResponseField>

<ResponseField name="port_min / port_max" type="integer">
  Necessário para `tcp` e `udp`, e rejeitado sem eles. Ignorado — e limpo — para `icmp` e `all`. O intervalo deve satisfazer `0 ≤ port_min ≤ port_max ≤ 65535`. Para uma única porta, defina ambos para ela.
</ResponseField>

<ResponseField name="remote_cidr / source_security_group_id" type="string | uuid" required>
  **Exatamente um dos dois é necessário.** Eles são mutuamente exclusivos, e omitir ambos é rejeitado — não há nenhuma abreviatura de "qualquer fonte"; escreva `0.0.0.0/0` ou `::/0` explicitamente. `remote_cidr` deve corresponder ao `ethertype` da regra.
</ResponseField>

As regras são apenas de criação e exclusão; não há atualização. Para alterar um, exclua-o e crie o substituto.

<a id="naming-another-group-as-the-source" />

### Nomear outro grupo como a fonte

<Tabs>
  <Tab title="Console">
    Em **Add inbound rule**, alterne o bloco **Source** de **CIDR** para **Security Group** e, em seguida, **Pick a source security group**.
  </Tab>

  <Tab title="API">
    ```json theme={null}
    { "direction": "ingress", "protocol": "tcp", "port_min": 5432, "port_max": 5432,
      "source_security_group": "<the app tier's group>" }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic network security-group-rule create <db-tier-group-id> \
      --direction ingress --protocol tcp --port-min 5432 --port-max 5432 \
      --source-security-group <app-tier-group-id>
    ```
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    rule, err := network.New(cfg).CreateSecurityGroupRule(ctx, dbTierGroupID,
        &network.SecurityGroupRuleCreateRequest{
            Direction:             "ingress",
            Protocol:              "tcp",
            PortMin:               basaltic.Int(5432),
            PortMax:               basaltic.Int(5432),
            SourceSecurityGroup: basaltic.String(appTierGroupID),
        })
    ```
  </Tab>
</Tabs>

Isso significa "qualquer carga de trabalho nesse grupo", combinada pelos endereços de seus membros atuais. Adicionar uma instância à camada de aplicativo torna o banco de dados acessível a partir dela sem alteração de regra, e remover uma a fecha novamente. Isso evita a manutenção de listas de CIDR que ficam desatualizadas toda vez que uma camada é dimensionada.

### Stateful

O tráfego de retorno de uma conexão permitida é permitido automaticamente. Você não escreve uma regra espelhada na direção oposta — uma regra de entrada para TCP 443 já deixa as respostas sair.

<a id="attaching-groups-to-an-interface" />

## Anexando grupos a uma interface

A associação pertence à interface, não ao grupo. Não há nada na própria página de um grupo de segurança que o anexe a qualquer coisa.

<Tabs>
  <Tab title="Console">
    Abra a NIC em **Networking → Interfaces** e escolha **Attach
    security group**; a caixa de diálogo observa que as regras do grupo "começam a filtrar o tráfego desta interface assim que ela é anexada." Sua aba **Security
    groups** lista o que está anexado, cada linha com uma ação **Detach security
    group**.

    O console adiciona e remove um grupo de cada vez e recria a lista completa para você, para que você não precise pensar sobre a semântica definida abaixo.
  </Tab>

  <Tab title="API">
    ```bash theme={null}
    GET /v1/interfaces/{interface_id}/security-groups
    PUT /v1/interfaces/{interface_id}/security-groups
    { "security_groups": ["<sg-a>", "<sg-b>"] }
    ```
  </Tab>

  <Tab title="CLI">
    ```bash theme={null}
    basaltic network interface list-security-groups <interface-id>
    basaltic network interface set-security-group <interface-id> \
      --security-groups <sg-a>,<sg-b>
    ```

    `--security-groups` é o conjunto inteiro, não uma adição — a mesma semântica de substituição que o `PUT`.
  </Tab>

  <Tab title="Go">
    ```go theme={null}
    n := network.New(cfg)
    current, err := n.ListInterfaceSecurityGroups(ctx, interfaceID)
    groups, err := n.SetInterfaceSecurityGroups(ctx, interfaceID,
        &network.InterfaceSecurityGroupsRequest{
            SecurityGroups: []string{groupA, groupB},
        })
    ```
  </Tab>
</Tabs>

<Warning>
  `PUT` **substitui** toda a associação atomicamente. É um conjunto, não um apêndice: envie a lista completa que você quiser, porque qualquer coisa que você deixar de fora é separada. Enviar `{"security_groups": []}` remove todos os grupos da interface, o que deixa tudo descartado.

  Esta é a armadilha que o console esconde — leia a lista atual com o `GET`, adicione ou solte seu id, e envie tudo de volta.
</Warning>

Cada id tem que ser um grupo que sua conta possui. Quando vários grupos se aplicam a uma interface, suas regras de permissão são **unidas** — uma interface é pelo menos tão aberta quanto seu grupo mais permissivo. Não é possível subtrair com um grupo de segurança; para restringir uma interface, remova o grupo que permite o tráfego.

A exclusão de um grupo é recusada enquanto qualquer interface ainda pertence a ele. Esvazie a associação em cada interface primeiro. `name` é imutável; `description` e `tags` podem ser corrigidos.

<a id="what-the-platform-enforces-regardless" />

## O que a plataforma impõe independentemente

Uma pequena faixa de regras fica acima da sua. Você não pode substituí-los ou removê-los por meio desta API.

<a id="always-allowed" />

### Sempre permitido

DHCP, descoberta de vizinhos IPv6 e o ponto de extremidade de metadados local de link em `169.254.169.254`. Cada instância precisa deles para alugar seu endereço e para acessar os metadados da instância na inicialização, para que eles sobrevivam a uma postura de negação padrão — caso contrário, uma instância bloqueada corretamente nunca poderia terminar de inicializar.

<a id="always-blocked-outbound-tcp-25-to-the-internet" />

### Sempre bloqueado: TCP 25 de saída para a internet

O SMTP direto para MX de uma instância comprometida ou alugada é a maneira mais rápida de um intervalo de endereços ser incluído em uma lista de bloqueio de spam, e o custo disso recai sobre todos que compartilham o intervalo. O envelope carrega seu endereço, então o bloqueio está na porta 25 especificamente.

<Note>
  As portas de envio **465, 587 e 2525 não estão bloqueadas**. O correio entregue a um provedor autenticado sai dos endereços desse provedor carregando a reputação desse provedor, então bloquear esses não compra nada e quebra uma grande quantidade de software que só fala SMTP.

  A exclusão da porta 25 também exclui destinos privados, de modo que seu próprio servidor de e-mail dentro da VPC permanece acessível a partir de outra instância.
</Note>

<a id="next" />

## Próximo

<CardGroup cols={2}>
  <Card title="Interfaces" icon="network" href="/pt/networking/interfaces">
    O que é uma NIC e como ela obtém seus grupos de segurança.
  </Card>

  <Card title="Roteamento" icon="route" href="/pt/networking/routing">
    Os grupos de segurança decidem o último salto. O roteamento decide se o pacote chega.
  </Card>
</CardGroup>


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