Настройка аутентификации AWS
Плагины источников данных Grafana выполняют запросы к AWS от имени роли AWS Identity and Access Management (IAM) или пользователя IAM. Пользователь или роль IAM должны иметь связанные политики для выполнения определённых действий API при запросе данных источника данных. Поскольку эти политики специфичны для каждого источника данных, за подробностями обращайтесь к документации соответствующего плагина источника данных.
Бэкенд Grafana выполняет все запросы к AWS API на стороне сервера, используя официальный AWS SDK.
В этом документе рассматриваются следующие темы:
- Выбор метода аутентификации
- Принятие роли
- Использование пользовательской конечной точки
- Использование файла учётных данных AWS
- Использование ролей EKS IAM для сервисных учётных записей
Выбор метода аутентификации
Доступные методы аутентификации зависят от вашей конфигурации и среды, в которой работает Grafana.
Grafana с открытым исходным кодом по умолчанию включает методы AWS SDK Default, Credentials file и Access & secret key. Grafana Cloud по умолчанию включает Access & secret key и Grafana Assume Role. Пользователи с доступом к конфигурации сервера могут включать или отключать определённые провайдеры аутентификации по мере необходимости. Подробнее см.
документацию по allowed_auth_providers.
AWS SDK Defaultиспользует провайдер по умолчанию из AWS SDK для Go без дополнительной настройки. Этот метод требует настройки учётных данных AWS вне Grafana через CLI либо путём привязки учётных данных непосредственно к инстансу EC2, в задаче ECS или для сервисной учётной записи в кластере Kubernetes. Вы можете привязать разрешения непосредственно к источнику данных с помощью AWS SDK Default или комбинировать его с необязательным полемAssume Role ARN.Credentials fileсоответствует провайдеру SharedCredentialsProvider в AWS SDK для Go. Этот метод читает общий файл учётных данных AWS для указанного профиля. В отличие отAWS SDK Default, который также читает общий файл учётных данных, этот параметр позволяет указать профиль напрямую, без переменных окружения. Эта опция не предусматривает отката к другим провайдерам учётных данных и завершается ошибкой, если учётные данные в файле недействительны.Access & secret keyсоответствует StaticProvider и выполняет аутентификацию с использованием указанной пары — идентификатора ключа доступа и секретного ключа. Этот метод не обеспечивает резервную аутентификацию и завершается ошибкой, если пара ключей недействительна. Он доступен в Grafana Cloud, хотя там рекомендуетсяGrafana Assume Role, поскольку этот метод позволяет избежать управления долгосрочными ключами доступа.Grafana Assume Role— при использовании этого метода аутентификации пользователи Grafana Cloud создают роль AWS IAM, которая имеет доверительные отношения с учётной записью AWS Grafana. Grafana использует STS для создания временных учётных данных от своего имени. Этот метод исключает необходимость создавать секретные ключи и ключи доступа для пользователей. Подробнее см. Использование Grafana Assume Role.Workspace IAM Roleсоответствует EC2RoleProvider. EC2RoleProvider извлекает учётные данные из роли, привязанной к инстансу EC2, на котором работает Grafana. Хотя AWS SDK Default может дать аналогичный результат, эта опция не обеспечивает резервную аутентификацию. Amazon Managed Grafana включает эту опцию по умолчанию.
Принятие роли
Укажите роль IAM, которую нужно принять, в поле Assume Role ARN.
Когда вы настраиваете Assume Role ARN, Grafana использует предоставленные учётные данные для выполнения вызова sts:AssumeRole. Основному методу аутентификации нужно только разрешение на принятие роли, тогда как принятой роли требуются разрешения на доступ к CloudWatch.
Например, вы можете использовать один набор долгосрочных учётных данных для всех источников данных AWS, но при этом хотите ограничить доступ каждого источника данных к AWS (например, разделить доступ к данным staging и production). Вы могли бы создать отдельные учётные данные для каждого источника данных с разными разрешениями, но такой подход требует управления и ротации множества секретных ключей и ключей доступа во множестве экземпляров источников данных.
Вместо этого функциональность принятия роли позволяет использовать один набор учётных данных AWS для всех источников данных AWS с единственным разрешением: возможностью принимать роли через STS. Затем вы создаёте отдельные роли IAM для каждого источника данных, которые задают временные разрешения. Поскольку роли IAM не являются учётными данными, они не требуют ротации и упрощают управление.
Если поле Assume Role ARN оставить пустым, Grafana использует предоставленные учётные данные выбранного метода аутентификации напрямую, и разрешения на доступ к данным AWS должны быть привязаны непосредственно к этим учётным данным. Поле Assume Role ARN необязательно для всех методов аутентификации, кроме Grafana Assume Role.
Чтобы отключить эту функциональность в Grafana с открытым исходным кодом или Grafana Enterprise, см.
assume_role_enabled.
Использование внешнего идентификатора
Note
Вы не можете использовать внешний идентификатор для провайдера аутентификации Grafana Assume Role.
Чтобы принять роль в другой учётной записи, созданную с внешним идентификатором, укажите внешний идентификатор в поле External ID.
Подробнее см. документацию AWS по внешним идентификаторам.
Использование пользовательской конечной точки
Используйте поле Endpoint, чтобы указать URL пользовательской конечной точки, который переопределяет конечную точку API сервиса AWS по умолчанию. Оставьте это поле пустым, чтобы использовать сгенерированную конечную точку по умолчанию.
Дополнительные сведения об использовании конечных точек сервисов см. в документации по конечным точкам сервисов AWS.
Использование файла учётных данных AWS
Создайте файл по пути ~/.aws/credentials — это путь HOME для пользователя, от имени которого работает служба grafana-server.
Note
Если файл учётных данных, судя по всему, находится в правильном месте, но не работает, переместите ваш файл
awsв/usr/share/grafana/и установите права доступа к файлу учётных данных в0644.
Пример файла учётных данных:
[default]
aws_access_key_id = asdsadasdasdasd
aws_secret_access_key = dasdasdsadasdasdasdsa
region = us-west-2
Использование ролей EKS IAM для сервисных учётных записей
Роли EKS IAM для сервисных учётных записей (IRSA) — это возможность AWS EKS, которая позволяет подам принимать роли IAM без хранения долгосрочных учётных данных. Когда вы настраиваете IRSA в вашем кластере EKS, AWS внедряет временные учётные данные в ваш под в виде проецируемых монтирований томов.
В контейнерах Grafana процесс выполняется от имени пользователя 472 (grafana).
По умолчанию Kubernetes монтирует проецируемые учётные данные с правами доступа только для пользователя root.
Чтобы предоставить пользователю 472 доступ к учётным данным и предотвратить откат к роли IAM, привязанной к инстансу EC2, задайте контекст безопасности для вашего пода.
Пример контекста безопасности:
securityContext:
fsGroup: 472
runAsUser: 472
runAsGroup: 472
Использование Grafana Assume Role
Note
Grafana Assume Role доступен только в Grafana Cloud. В настоящее время он поддерживается только для источников данных Amazon CloudWatch и Amazon Athena.
Провайдер аутентификации Grafana Assume Role позволяет получить доступ к AWS без создания долгосрочных пользователей AWS IAM и управления ими, а также без ротации ключей доступа. Вместо этого вы можете создать роль IAM, которая имеет разрешения на доступ к CloudWatch и доверяет учётной записи AWS Grafana.
Затем учётная запись AWS Grafana выполняет запрос к Security Token Service (STS), чтобы создать временные учётные данные для ваших данных AWS. Этот запрос включает externalID, уникальный для вашей учётной записи Grafana Cloud, что гарантирует, что пользователи смогут получить доступ только к своим собственным ресурсам AWS.
Note
В политике доверия общей учётной записи AWS Grafana назначается роль доверенного субъекта, но это не даёт каждому клиенту Grafana доступ к вашей роли. Условие
sts:ExternalIdограничивает доверие вашим уникальным внешним идентификатором, поэтому AWS разрешает только запрос на принятие роли, который предъявляет именно это значение. Grafana отправляет ваш внешний идентификатор только для запросов к вашему собственному источнику данных. Внешний идентификатор не является секретом, но вместе с доверием на уровне учётной записи он гарантирует, что один клиент не сможет принять роль другого клиента. Сохраняйте условиеsts:ExternalIdв политике доверия — его удаление позволит любой учётной записи, которой доверяет Grafana, принять вашу роль.
Подробнее см. документацию AWS по внешним идентификаторам.
Чтобы использовать Grafana Assume Role:
- Создайте новый источник данных CloudWatch (или обновите существующий) и выберите Grafana Assume Role в качестве провайдера аутентификации.
- В консоли AWS создайте новую роль IAM и в разделе Trusted entity type выберите Another AWS account в качестве доверенного субъекта.
- Введите идентификатор учётной записи Grafana (он отображается в блоке инструкций на вкладке Settings конфигурации источника данных CloudWatch) и установите флажок Require external ID.
- Введите внешний идентификатор, указанный в блоке инструкций на вкладке Settings конфигурации источника данных CloudWatch в Grafana. Этот внешний идентификатор будет уникальным для вашего экземпляра Grafana.
- Прикрепите все необходимые разрешения, которые вы хотите предоставить Grafana для доступа от вашего имени (например, политики CloudWatch Logs и CloudWatch Metrics).
- Задайте имя и описание роли и нажмите Create role.
- Скопируйте ARN только что созданной роли и вставьте его в поле Assume Role ARN на вкладке Settings конфигурации источника данных CloudWatch в Grafana.
Пример доверительных отношений для роли IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": {Grafana's AWS Account}
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": {External ID unique to your account}
}
}
}
]
}