Перейти к основному содержанию
Перейти к основному содержанию

Безопасный доступ к данным в S3

В этой статье показано, как использовать доступ на основе ролей для аутентификации в Amazon Simple Storage Service (S3) и безопасного доступа к данным из ClickHouse Cloud.

Введение

Прежде чем переходить к настройке безопасного доступа к S3, важно понять, как это работает. Ниже приведён обзор того, как сервисы ClickHouse могут получать доступ к приватным S3‑бакетам, принимая на себя роль в вашем аккаунте AWS.

Overview of Secure S3 Access with ClickHouse

Такой подход позволяет вам управлять всем доступом к S3‑бакетам в одном месте (IAM‑политика предполагаемой роли), без необходимости просматривать и изменять политики отдельных бакетов для предоставления или отзыва доступа.

Настройка

Получение ARN роли IAM сервиса ClickHouse

1 - Войдите в свою учетную запись ClickHouse Cloud.

2 - Выберите сервис ClickHouse, из которого вы хотите осуществлять подключение.

3 - Откройте вкладку Settings.

4 - Прокрутите страницу вниз до раздела Network security information в нижней части страницы.

5 - Скопируйте значение Service role ID (IAM), соответствующее сервису, как показано ниже.

Obtaining ClickHouse service IAM Role ARN

Настройка роли IAM для операции AssumeRole

Вариант 1: Развертывание с помощью стека CloudFormation

1 - Войдите в свою учетную запись AWS в веб-браузере, используя IAM-пользователя с достаточными правами для создания и управления ролями IAM.

2 - Перейдите по этой ссылке, чтобы создать стек CloudFormation.

3 - Введите IAM Role для сервиса ClickHouse, которую вы записали на предыдущем шаге.

4 - Настройте стек CloudFormation. Ниже приведена дополнительная информация об этих параметрах.

ПараметрЗначение по умолчаниюОписание
RoleNameClickHouseAccess-001Имя новой роли, которую ClickHouse Cloud будет использовать для доступа к вашему S3-бакету.
Role Session Name*Role Session Name может использоваться в качестве общего секрета для дополнительной защиты вашего бакета.
ClickHouse Instance RolesСписок через запятую IAM-ролей сервиса ClickHouse, которые могут использовать эту защищенную интеграцию с S3.
Bucket AccessReadЗадает уровень доступа для указанных бакетов.
Bucket NamesСписок через запятую имен бакетов, к которым эта роль будет иметь доступ. Примечание: используйте имя бакета, а не полный ARN бакета.

5 - Установите флажок I acknowledge that AWS CloudFormation might create IAM resources with custom names.

6 - Нажмите кнопку Create stack в правом нижнем углу.

7 - Убедитесь, что стек CloudFormation создан без ошибок.

8 - Перейдите в раздел Outputs стека CloudFormation.

9 - Скопируйте значение RoleArn для этой интеграции. Оно понадобится для настройки доступа к вашему S3-бакету на следующем шаге.

Результат стека CloudFormation с отображением IAM Role ARN

Вариант 2: создание роли IAM вручную

1 - Войдите в свою учетную запись AWS в веб-браузере под IAM-пользователем, который имеет права на создание и управление ролями IAM.

2 - Перейдите в консоль сервиса IAM.

3 - Создайте новую роль IAM со следующими политиками IAM и доверия, заменив {ClickHouse_IAM_ARN} на ARN роли IAM, принадлежащей вашему экземпляру ClickHouse, а {BUCKET_NAME} — на имя бакета.

Политика доверия

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "{ClickHouse_IAM_ARN}"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

Политика IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::{BUCKET_NAME}"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::{BUCKET_NAME}/*"
            ],
            "Effect": "Allow"
        }
    ]
}

4 - После создания скопируйте новый IAM Role Arn. Он понадобится для настройки доступа к вашему S3-бакету на следующем шаге.

Доступ к бакету S3 с ролью ClickHouseAccess

В ClickHouse Cloud появилась новая возможность указывать параметр extra_credentials в S3 table function. Ниже приведён пример того, как выполнить запрос, используя только что созданную роль, скопированную выше.

DESCRIBE TABLE s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001'))

Ниже приведён пример запроса, который использует role_session_name как общий секрет для выборки данных из бакета. Если значение role_session_name указано неверно, операция завершится с ошибкой.

DESCRIBE TABLE s3('https://s3.amazonaws.com/BUCKETNAME/BUCKETOBJECT.csv','CSVWithNames',extra_credentials(role_arn = 'arn:aws:iam::111111111111:role/ClickHouseAccessRole-001', role_session_name = 'secret-role-name'))
Примечание

Мы рекомендуем размещать исходное хранилище S3 в том же регионе, что и ваш сервис ClickHouse Cloud, чтобы снизить затраты на передачу данных. Для получения дополнительной информации см. раздел S3 pricing.

Расширенное управление действиями

Для более строгого контроля доступа можно ограничить политику S3‑бакета так, чтобы она принимала только запросы, исходящие из конечных точек VPC ClickHouse Cloud, с использованием условия aws:SourceVpce. Чтобы получить конечные точки VPC для вашего региона ClickHouse Cloud, откройте терминал и выполните:

# Replace <your-region> with your ClickHouse Cloud region
curl -s https://api.clickhouse.cloud/static-ips.json | jq -r '.aws[] | select(.region == "<your-region>") | .s3_endpoints[]'

Затем добавьте правило Deny в политику IAM с полученными конечными точками:

{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "s3:List*",
                    "s3:Get*"
                ],
                "Resource": [
                    "arn:aws:s3:::{BUCKET_NAME}",
                    "arn:aws:s3:::{BUCKET_NAME}/*"
                ]
            },
            {
                "Sid": "VisualEditor3",
                "Effect": "Deny",
                "Action": [
                    "s3:GetObject"
                ],
                "Resource": "*",
                "Condition": {
                    "StringNotEquals": {
                        "aws:SourceVpce": [
                            "{ClickHouse VPC ID from your S3 region}",
                            "{ClickHouse VPC ID from your S3 region}",
                            "{ClickHouse VPC ID from your S3 region}"
                        ]
                    }
                }
            }
        ]
}

Дополнительную информацию о доступе к конечным точкам служб ClickHouse Cloud см. в разделе Cloud IP Addresses.