[Документация Yandex Cloud](../../index.md) > [Безопасность в Yandex Cloud](../index.md) > [Рекомендации по защите облачной инфраструктуры](index.md) > Референсная архитектура для облачной инфраструктуры в изолированном режиме без доступа в интернет

# Референсная архитектура для облачной инфраструктуры в изолированном режиме без доступа в интернет

Одним из клиентских сценариев в Yandex Cloud является развертывание облачной инфраструктуры без доступа в интернет. Облачные ресурсы должны быть доступны только из собственной инфраструктуры клиента ([on‑premise](https://en.wikipedia.org/wiki/On-premises_software)) и недоступны из интернет. Если для работы облачных ресурсов требуется сетевое взаимодействие с внешними ресурсами в интернет, то этот трафик должен проходить через собственную инфраструктуру клиента (например, межсетевые экраны), осуществляющую контроль доступа в интернет.

Раздел содержит рекомендации для реализации данного сценария.

## Организация сетевого взаимодействия

Для данного сценария рекомендуемым способом организации сетевой IP-связности между ресурсами в собственной инфраструктуре клиента и облачными ресурсами в Yandex Cloud является подключение [Cloud Interconnect](../../interconnect/concepts/index.md):
* С использованием выделенных физических каналов сетевое оборудование клиента подключается к оборудованию Yandex Cloud в [точках присутствия](../../interconnect/concepts/pops.md) напрямую с помощью кроссировки или через операторов связи.
* Через подключения Cloud Interconnect возможна организация логических соединений как в [облачные сети](../../interconnect/concepts/priv-con.md) клиента, так и к [сервисам](../../interconnect/concepts/pub-con.md) Yandex Cloud (например, [Object Storage](../../storage/index.md)).
* Для обеспечения отказоустойчивости в предоставлении услуги Cloud Interconnect рекомендуется организовывать подключения на нескольких [точках присутствия](../../interconnect/concepts/pops.md).
* Подробные инструкции для подключения и управления услугой Cloud Interconnect приведены в [документации](../../interconnect/operations/index.md).

## Управление ресурсами и доступом
Ресурсная модель Yandex Cloud предполагает, что любой пользователь облака с правами `editor` или `admin` на ресурс может изменять его характеристики. В сценарии изолированной инфраструктуры возникает риск несанкционированного изменения характеристик ресурса, что нарушает модель угроз с точки зрения изоляции. Подобные события рекомендуется отслеживать через логи аудита сервиса ([Audit Trails](../../audit-trails/index.md)) и настройку оповещений в [SIEM](https://ru.wikipedia.org/wiki/SIEM), однако существует и проактивный подход к контролю изменений защищаемой среды.

GitOps - подход к управлению инфраструктурой через формальное описание продуктовой инфраструктуры в коде ([Infrastructure as Code](https://ru.wikipedia.org/wiki/Инфраструктура_как_код)) согласно модели угроз и применение изменений всех компонентов инфраструктуры через пул-реквесты в репозиторий исходного кода с последующим применением изменений в контексте сервисного аккаунта Yandex Cloud. Всем пользователям облака при этом должна быть назначена роль `auditor` или `viewer` на все сервисы продуктивной среды. Это позволяет нивелировать риски:
* несанкционированного доступа к ресурсам и данным;
* несанкционированного копирования или удаления ресурсов и данных администраторами облака;
* несанкционированного изменения ресурсов, влекущего нарушение модели угроз (например назначение публичного IP-адреса на сетевой интерфейс или создание шлюза в сеть интернет);
* любых неформализованных ("ручных") изменений с использованием повышенных привилегий.

Так как любое изменение подразумевает создание пул-реквеста в репозиторий исходного кода согласно принципам DevOps, то верификация и принятие решения о применении изменений зависит от ревьюеров (ответственных сотрудников). Изменения проверяются на корректность другими сотрудниками, исключая единоличное принятие решения автором пул-реквеста. При таком подходе вся история изменений ведется средствами системы управления репозиториями кода. На уровне организации Yandex Cloud у пользователей не должно быть административных привилегий, а все необходимые роли для различных сред следует выдавать через членство в группах субъектов.

Для управления репозиториями с кодом Yandex Cloud предоставляет сервис [Yandex Managed Service for GitLab](../../managed-gitlab/index.md).

## Требования к облачным сервисам

Ниже рассмотрены рекомендации по реализации данного сценария на примере основных сервисов Yandex Cloud: 
* [Compute Cloud](#computecloud)
* [Virtual Private Cloud](#virtualprivatecloud)
* [Network Load Balancer](#networkloadbalancer)
* [Application Load Balancer](#applicationloadbalancer)
* [Managed Service for Kubernetes](#managedserviceforkubernetes)
* [Managed Service for PostgreSQL](#managedserviceforpostgresql)
* [Managed Service for ClickHouse®](#managedserviceforclickhouse)
* [Cloud Functions и Serverless Containers](#cloudfunctionsiserverlesscontainers)

По особенностям реализации доступа в интернет для других сервисов Yandex Cloud рекомендуется обращаться к [документации](../../index.md) соответствующего сервиса.

### Compute Cloud {#computecloud}

Виртуальные машины не должны иметь [публичных IP-адресов](../../compute/concepts/network.md#public-ip). 

{% list tabs group=instructions %}

- Консоль управления {#console}

   {% note info %}
   
   Способ проверки через консоль не показывает публичных IP-адресов остановленных ВМ. В таком случае рекомендуется использовать проверку через CLI.
   
   {% endnote %}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Virtual Private Cloud / Публичные IP-адреса**.
   1. Если Вы видите сообщение `У вас пока нет публичных IP-адресов` или зарезервированные публичные IP-адреса не используются для ВМ, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```
      
   1. Выполните команду для поиска всех ВМ с публичными IP-адресами:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do VM_LIST=$(yc compute instance list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.network_interfaces[].primary_v4_address.one_to_one_nat)' | jq -r '.id');
      if [ -n "$VM_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nVM_ID:\n$VM_LIST\n-----\n"; fi;
      done;
      done
      ```
    
   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}


**Инструкции и решения по выполнению**:
* Не выдавайте пользователям [ролей](../../vpc/security/index.md), позволяющих создавать публичные IP-адреса для виртуальных машин. Роли, которые дают возможность назначения публичных IP-адресов для ВМ: `admin`, `editor`, `vpc.admin`, `vpc.publicAdmin`.
* В случае наличия публичных IP-адресов на ВМ [отвяжите](../../compute/operations/vm-control/vm-detach-public-ip.md) их и, если это были статические IP-адреса, [удалите](../../vpc/operations/address-delete.md) их.

### Virtual Private Cloud {#virtualprivatecloud}

В облачной сети не должно быть [NAT-шлюзов](../../vpc/concepts/gateways.md), через которые может быть предоставлен доступ в интернет для облачных ресурсов.

{% list tabs group=instructions %}

- Консоль управления {#console}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Virtual Private Cloud / Шлюзы**.
   1. Если Вы видите сообщение `Нет ни одного шлюза`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```

   1. Выполните команду для поиска наличия NAT-шлюзов:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do NAT_GW_LIST=$(yc vpc gateway list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.id)' | jq -r '.id');
      if [ -n "$NAT_GW_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nNAT_GW:\n$NAT_GW_LIST\n-----\n"; fi;
      done;
      done
      ```

   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}

**Инструкции и решения по выполнению**:
* Не выдавайте пользователям [ролей](../../vpc/security/index.md), позволяющих создавать NAT-шлюзы. Роли, которые дают возможность создания NAT-шлюзов: `admin`, `editor`, `vpc.gateways.editor`, `vpc.admin`, `vpc.publicAdmin`.
* В случае наличия NAT-шлюзов [удалите](../../vpc/operations/delete-nat-gateway.md) их.

### Network Load Balancer {#networkloadbalancer}

Сетевой балансировщик [Network Load Balancer](../../network-load-balancer/concepts/index.md) можно развернуть в следующих вариантах:
* Внешний балансировщик — создается по умолчанию. Имеет публичный IP-адрес и используется для обработки трафика из интернета. 
* Внутренний балансировщик — используется для обработки трафика внутри VPC. Имеет внутренний IP-адрес.

В облачной инфраструктуре не должно быть внешних балансировщиков. Допустимо использование внутренних балансировщиков. 

{% list tabs group=instructions %}

- Консоль управления {#console}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Network Load Balancer / Балансировщики**.
   1. Если в списке отсутствуют балансировщики с типом `EXTERNAL`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```
      
   1. Выполните команду для поиска всех внешних балансировщиков:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do NLB_LIST=$(yc load-balancer network-load-balancer list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.type == "EXTERNAL")' | jq -r '.id');
      if [ -n "$NLB_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nNLB_ID:\n$NLB_LIST\n-----\n"; fi;
      done;
      done
      ```
      
   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}

**Инструкции и решения по выполнению**:
* Не выдавайте пользователям [ролей](../../network-load-balancer/security/index.md), позволяющих создавать внешние балансировщики. Роли, которые дают возможность создания внешних балансировщиков: `admin`, `editor`, `load-balancer.admin`.
* В случае наличия внешних балансировщиков [удалите](../../network-load-balancer/operations/load-balancer-delete.md) их.

### Application Load Balancer {#applicationloadbalancer}

У L7-балансировщиков [Application Load Balancer](../../application-load-balancer/concepts/application-load-balancer.md) не должно быть публичных IP-адресов на обработчиках. Допускается использование внутренних IP-адресов на обработчиках.

{% list tabs group=instructions %}

- Консоль управления {#console}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Virtual Private Cloud / Публичные IP-адреса**.
   1. Если Вы видите сообщение `У вас пока нет публичных IP-адресов` или зарезервированные публичные IP-адреса не используются для обработчиков L7-балансировщиков, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```
      
   1. Выполните команду для поиска всех L7-балансировщиков с публичными IP-адресами на обработчиках:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do ALB_LIST=$(yc application-load-balancer load-balancer list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(has("listeners")) | select(.listeners[].endpoints[].addresses[].external_ipv4_address)' | jq -r '.id' );
      if [ -n "$ALB_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nALB_ID:\n$ALB_LIST\n-----\n" | sort -u; fi;
      done;
      done
      ```

   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}

**Инструкции и решения по выполнению**:
* Не выдавайте пользователям [ролей](../../application-load-balancer/security/index.md), позволяющих назначать публичные IP-адреса на обработчики L7-балансировщиков. Роли, которые дают возможность назначения публичных IP-адресов на обработчики L7-балансировщиков: `admin`, `editor`, `vpc.admin`, `vpc.publicAdmin`.
* В случае наличия публичных IP-адресов на обработчиках L7-балансировщиках [удалите эти обработчики](../../application-load-balancer/operations/application-load-balancer-update.md#delete-listener) и, если это были статические IP-адреса, [удалите](../../vpc/operations/address-delete.md) их.

### Managed Service for Kubernetes {#managedserviceforkubernetes}

У кластера и группы узлов Managed Service for Kubernetes не должно быть [публичных IP-адресов](../../managed-kubernetes/concepts/network.md#public-access-to-a-host). В облачной сети, где размещается кластер и группа узлов, не должно быть [NAT-шлюзов](../../vpc/concepts/gateways.md). У сервисных аккаунтов для кластера не должно быть ролей на создание балансировщиков, имеющих доступ в интернет (Смотрите пункт «Инструкции и решения по выполнению»).

Подробности по созданию и настройке кластера Managed Service for Kubernetes без доступа в интернет смотрите в [практическом руководстве](../../managed-kubernetes/tutorials/k8s-cluster-with-no-internet.md). В руководстве указаны минимальные роли, которые необходимо назначить сервисным аккаунтам для создания такого кластера.

{% list tabs group=instructions %}

- Консоль управления {#console}

   {% note info %}
   
   Способ проверки через консоль подразумевает проверку наличия публичного доступа для каждого кластера по отдельности. При большом количестве кластеров рекомендуется использовать проверку через CLI.
   
   {% endnote %}

   {% note info %}
   
   Способ проверки через консоль не показывает публичных IP-адресов узлов остановленного кластера. В таком случае рекомендуется использовать проверку через CLI.
   
   {% endnote %}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Managed Service for Kubernetes** и выберите кластер.
   1. Если на вкладке **Обзор** поле `Публичный IPv4` у кластера отсутствует, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».
   1. Перейдите в раздел **Virtual Private Cloud / Публичные IP-адреса**.
   1. Если Вы видите сообщение `У вас пока нет публичных IP-адресов` или зарезервированные публичные IP-адреса не используются для ВМ (узлов кластера) или L7-балансировщиков, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».
   1. Перейдите в раздел **Virtual Private Cloud / Шлюзы**.
   1. Если Вы видите сообщение `Нет ни одного шлюза`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».
   1. Перейдите в раздел **Network Load Balancer / Балансировщики**.
   1. Если в списке отсутствуют балансировщики с типом `EXTERNAL`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```
      
   1. Выполните команду для поиска всех кластеров с публичными адресами:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id');
      do CLUSTER_LIST=$(yc managed-kubernetes cluster list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.master.endpoints.external_v4_endpoint)' | jq -r '.id');
      if [ -n "$CLUSTER_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nK8S_CLUSTER_ID:\n$CLUSTER_LIST\n-----\n"; fi;
      done;
      done
      ```

   1. Выполните команду для поиска всех групп узлов с публичными IP-адресами:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do NODE_GROUP_LIST=$(yc managed-kubernetes node-group list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.node_template.network_interface_specs[].primary_v4_address_spec.one_to_one_nat_spec)' | jq -r '.id');
      if [ -n "$NODE_GROUP_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nNODE_GROUP:\n$NODE_GROUP_LIST\n-----\n"; fi;
      done;
      done
      ```
      
   1. Выполните команду для поиска наличия NAT-шлюзов:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do NAT_GW_LIST=$(yc vpc gateway list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.id)' | jq -r '.id');
      if [ -n "$NAT_GW_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nNAT_GW:\n$NAT_GW_LIST\n-----\n"; fi;
      done;
      done
      ```
      
   1. Выполните команду для поиска наличия внешних балансировщиков NLB:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do NLB_LIST=$(yc load-balancer network-load-balancer list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.type == "EXTERNAL")' | jq -r '.id');
      if [ -n "$NLB_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nNLB_ID:\n$NLB_LIST\n-----\n"; fi;
      done;
      done
      ```
      
   1. Выполните команду для поиска всех L7-балансировщиков с публичными IP-адресами на обработчиках:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do ALB_LIST=$(yc application-load-balancer load-balancer list --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(has("listeners")) | select(.listeners[].endpoints[].addresses[].external_ipv4_address)' | jq -r '.id' );
      if [ -n "$ALB_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nALB_ID:\n$ALB_LIST\n-----\n" | sort -u; fi;
      done;
      done
      ```

   1. Если выводы всех команд пустые, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}

**Инструкции и решения по выполнению**:
* Не выдавайте сервисным аккаунтам для кластера Kubernetes [ролей](../../managed-kubernetes/security/index.md), позволяющих использовать публичные IP-адреса для кластера или группы узлов и создавать балансировщики, имеющие доступ в интернет. Роли, которые дают возможность создавать кластера с доступом в интернет: `admin`, `editor`, `load-balancer.admin`, `vpc.admin`, `vpc.publicAdmin`.
* В случае наличия кластеров с публичными IP-адресами [удалите](../../managed-kubernetes/operations/kubernetes-cluster/kubernetes-cluster-delete.md) их. Для таких кластеров нет возможности удалить непосредственно публичный IP-адрес. Перед удалением кластеров перенесите рабочую нагрузку на кластера Kubernetes без публичных IP-адресов.
* В случае наличия групп узлов с публичными IP-адресами [измените](../../managed-kubernetes/operations/node-group/node-group-update.md) их, чтобы публичные IP-адреса не назначались узлам.
* В случае наличия внешних балансировщиков для [ресурсов Service](../../managed-kubernetes/nlb-ref/service.md) удалите их. 
* В случае наличия публичных IP-адресов для [Ingress-контроллеров Application Load Balancer](../../managed-kubernetes/alb-ref/ingress.md) удалите их.

   {% note tip %}
   
   Вместо ALB Ingress-контроллера и Gateway API рекомендуется использовать новый контроллер [Yandex Cloud Gwin](../../application-load-balancer/tools/gwin/index.md).
   
   {% endnote %}

* Не выдавайте пользователям [ролей](../../vpc/security/index.md), позволяющих создавать NAT-шлюзы. Роли, которые дают возможность создания NAT-шлюзов: `admin`, `editor`, `vpc.gateways.editor`, `vpc.admin`, `vpc.publicAdmin`.
* В случае наличия NAT-шлюзов [удалите](../../vpc/operations/delete-nat-gateway.md) их.


### Managed Service for PostgreSQL {#managedserviceforpostgresql}

У хостов в кластере не должно быть [публичного доступа](../../managed-postgresql/concepts/network.md#public-access-to-a-host).

{% list tabs group=instructions %}

- Консоль управления {#console}

   {% note info %}
   
   Способ проверки через консоль подразумевает проверку наличия публичного доступа у хостов для каждого кластера по отдельности. При большом количестве кластеров рекомендуется использовать проверку через CLI.
   
   {% endnote %}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Managed Service for PostgreSQL**. Зайдите в кластер и перейдите в раздел **Хосты**. 
   1. Если в столбце **Публичный доступ** для всех хостов кластера указано значение `Нет`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```
      
   1. Выполните команду для поиска всех хостов с публичными IP-адресами в кластерах:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do for PG_CLUSTER_ID in $(yc managed-postgresql cluster list --folder-id=$FOLDER_ID --format=json | jq -r '.[].id');
      do HOST_LIST=$(yc managed-postgresql hosts list --cluster-id=$PG_CLUSTER_ID --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.assign_public_ip)' | jq -r '.name' );
      if [ -n "$HOST_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nPG_CLUSTER_ID: $PG_CLUSTER_ID\nHOST_NAME:\n$HOST_LIST\n-----\n"; fi
      done;
      done;
      done
      ```

   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}

**Инструкции и решения по выполнению**:
* Не выдавайте пользователям [ролей](../../managed-postgresql/security/index.md), позволяющих настроить публичный доступ к хостам кластера. Роли, которые дают возможность настроить публичный доступ к хостам: `admin`, `editor`, `vpc.admin`, `vpc.publicAdmin`.
* В случае наличия публичного доступа у хостов в кластере [выключите](../../managed-postgresql/operations/hosts.md#update) для них опцию публичного доступа.

### Managed Service for ClickHouse® {#managedserviceforclickhouse}

У хостов в кластере не должно быть [публичного доступа](../../managed-clickhouse/concepts/network.md#public-access-to-a-host).

{% list tabs group=instructions %}

- Консоль управления {#console}

   {% note info %}

   Способ проверки через консоль подразумевает проверку наличия публичного доступа у хостов для каждого кластера по отдельности. При большом количестве кластеров рекомендуется использовать проверку через CLI.

   {% endnote %}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Managed Service for ClickHouse**. Зайдите в кластер и перейдите в раздел **Хосты**. 
   1. Если в столбце **Публичный доступ** для всех хостов кластера указано значение `Нет`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```
      
   1. Выполните команду для поиска всех хостов с публичными IP-адресами в кластерах:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do for CH_CLUSTER_ID in $(yc managed-clickhouse cluster list --folder-id=$FOLDER_ID --format=json | jq -r '.[].id');
      do HOST_LIST=$(yc managed-clickhouse hosts list --cluster-id=$CH_CLUSTER_ID --folder-id=$FOLDER_ID --format=json | jq -r '.[] | select(.assign_public_ip)' | jq -r '.name' );
      if [ -n "$HOST_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nCH_CLUSTER_ID: $CH_CLUSTER_ID\nHOST_NAME:\n$HOST_LIST\n-----\n"; fi
      done;
      done;
      done
      ```

   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}

**Инструкции и решения по выполнению**:
* Не выдавайте пользователям [ролей](../../managed-clickhouse/security.md), позволяющих настроить публичный доступ к хостам кластера. Роли, которые дают возможность настроить публичный доступ к хостам: `admin`, `editor`, `vpc.admin`, `vpc.publicAdmin`.
* В случае наличия публичного доступа у хостов в кластере [выключите](../../managed-clickhouse/operations/hosts.md#update)  для них опцию публичного доступа.

### Cloud Functions и Serverless Containers {#cloudfunctionsiserverlesscontainers}

В облачной инфраструктуре не должно быть функций или контейнеров. 

По умолчанию функция или контейнер запускается в изолированной IP-сети с включенным NAT-шлюзом. Из функции или контейнера доступны публичные IPv4-адреса. В настройках [функции](../../functions/concepts/networking.md#user-network) или [контейнера](../../serverless-containers/concepts/networking.md#user-network) можно указать облачную сеть. Тогда функция будет иметь доступ не только в интернет, но и к пользовательским ресурсам, которые находятся в указанной VPC, например базам данным, виртуальным машинам и другим ресурсам.

{% list tabs group=instructions %}

- Консоль управления {#console}

   1. Откройте [консоль управления](https://kz.console.yandex.cloud) в вашем браузере.
   1. Перейдите в нужный каталог.
   1. Перейдите в раздел **Cloud Functions**.
   1. Если Вы видите сообщение `Создайте вашу первую функцию`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».
   1. Перейдите в раздел **Serverless Containers**.
   1. Если Вы видите сообщение `Создайте ваш первый контейнер`, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

- CLI {#cli}

   1. Посмотрите доступные вам организации и зафиксируйте необходимый `ID`:
      
      ```
      yc organization-manager organization list
      ```
      
   1. Выполните команду для поиска всех функций:
      
      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do FUNC_LIST=$(yc serverless function list --folder-id=$FOLDER_ID --format=json | jq -r '.[].id');
      if [ -n "$FUNC_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nFUNCTION_ID:\n$FUNC_LIST\n-----\n"; fi;
      done;
      done
      ```
      
   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

   1. Выполните команду для поиска всех контейнеров:

      ```bash
      export ORG_ID=<ID организации>
      for CLOUD_ID in $(yc resource-manager cloud list --organization-id=${ORG_ID} --format=json | jq -r '.[].id');
      do for FOLDER_ID in $(yc resource-manager folder list --cloud-id=$CLOUD_ID --format=json | jq -r '.[].id'); 
      do CONT_LIST=$(yc serverless containers list --folder-id=$FOLDER_ID --format=json | jq -r '.[].id');
      if [ -n "$CONT_LIST" ]; then printf "FOLDER_ID: $FOLDER_ID\nCONTAINER_ID:\n$CONT_LIST\n-----\n"; fi;
      done;
      done
      ```

   1. Если вывод команды пустой, рекомендация выполняется. В противном случае перейдите к пункту «Инструкции и решения по выполнению».

{% endlist %}

**Инструкции и решения по выполнению**:
* Не выдавайте пользователям ролей, позволяющих создавать функции и контейнеры. [Роли](../../functions/security/index.md), которые дают возможность создания функций: `admin`, `editor`, `functions.admin`, `functions.editor`. [Роли](../../serverless-containers/security/index.md), которые дают возможность создания контейнеров: `admin`, `editor`, `serverless-containers.admin`, `serverless-containers.editor`.
* В случае наличия функций или контейнеров [удалите функции](../../functions/operations/function/function-delete.md) или [контейнеры](../../serverless-containers/operations/delete.md).