#amazon-web-services #amazon-rds #amazon-iam
#amazon-веб-сервисы #amazon-rds #amazon-iam
Вопрос:
У меня есть контейнеры на базе Java, в которых работает AWS ECS Fargate. Теперь мы получаем доступ к базе данных AWS RDS Postgres с помощью комбинации имени пользователя и пароля, но мне интересно, как сделать этот процесс более безопасным.
Но у меня есть проблема: как избежать хранения паролей пользователей в .psql scripts ( CREATE USER username WITH PASSWORD 'xxx'
)? Я думаю, что лучшим вариантом будет полностью отказаться от использования паролей, но я не уверен, как это сделать…
Загрузка паролей в контейнеры Fargate осуществляется из AWS Secrets Manager — это нормально.
У вас есть какие-либо советы, пожалуйста?
РЕДАКТИРОВАТЬ: я поделюсь своим прогрессом здесь, чтобы любой мог воспроизвести
Документы: https://docs.aws.amazon.com/…/…/…/UsingWithRDS.IAMDBAuth.html
Цель
— ПЕРВЫЙ ЭТАП —: PoC IAM Auth (с использованием IAM User)
- Я подготовил свой экземпляр RDS, чтобы разрешить авторизацию IAM
- Я создал пользователя IAM, прикрепил к нему новую политику IAM и создал ключ доступа.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "rds-db:*",
"Resource": "arn:aws:rds-db:eu-central-1:666:dbuser:db-YFVS/iam_user"
}
]
}
ПРИМЕЧАНИЕ: в ресурсе используется идентификатор ресурса, а не arn! (это можно найти на вкладке Конфигурации экземпляра rds)
CREATE USER iam_user;
GRANT rds_iam TO iam_user;
- Я протестировал соединение (после экспорта ключа доступа)
# Generate token
export RDSHOST="dev.aaaaa.eu-central-1.rds.amazonaws.com"
export PGPASSWORD="$(aws rds generate-db-auth-token --hostname $RDSHOST --port 5432 --region eu-central-1 --username iam_user )"
#Connect
psql "host=$RDSHOST port=5432 dbname=mydb user=iam_user password=$PGPASSWORD"
mydb->
Теперь я хотел бы продолжить реализацию Java и, кроме того, перейти на Fargate
Цель
— ВТОРОЙ ЭТАП —: внедрить IAM Auth в приложение Python Я следовал приведенному здесь руководству, и оно отлично работало. Я использовал учетные данные IAM (ключ, секрет) пользователя IAM, созданного на предыдущем шаге. Кроме того, я загрузил creds из ENVs вместо файла профиля.
import psycopg2
import sys
import boto3
ENDPOINT="postgresmydb.123456789012.us-east-1.rds.amazonaws.com"
PORT="5432"
USR="jane_doe"
REGION="us-east-1"
DBNAME="mydb"
session = boto3.Session(region_name='us-east-1',
aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'],
aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'])
token = client.generate_db_auth_token(DBHostname=ENDPOINT, Port=PORT, DBUsername=USR, Region=REGION)
try:
conn = psycopg2.connect(host=ENDPOINT, port=PORT, database=DBNAME, user=USR, password=token)
cur = conn.cursor()
cur.execute("""SELECT now()""")
query_results = cur.fetchall()
print(query_results)
except Exception as e:
print("Database connection failed due to {}".format(e))
Комментарии:
1. Если использование
AWS Secrets Manager
в порядке, почему бы им этого не сделать?2. @Marcin поскольку у нас пароли хранятся в виде открытого текста в сценариях .psql (где создается пользователь), я бы хотел избегать хранения паролей там или полностью избегать использования паролей (если это возможно)
3. Я вижу, RDS PostgreSQL поддерживает аутентификацию базы данных IAM . При этом вам «не нужно использовать пароль». Вы об этом думали?
4. @Marcin Я думаю, что это может быть ключом. Я спрашивал, потому что не был уверен, является ли это лучшим вариантом — мы попытаемся реализовать это, и в случае успеха я поделюсь результатом. Спасибо!
5. Нет проблем. Я дам ответ с предложением. Позже вы можете сообщить мне, как все прошло, если не возражаете.
Ответ №1:
На основе комментариев.
Способ не использовать пароль для доступа к RDS PostgreSQL — использовать аутентификацию базы данных IAM:
С помощью этого метода аутентификации вам не нужно использовать пароль при подключении к экземпляру базы данных. Вместо этого вы используете токен аутентификации.
Необходимо учитывать некоторые ограничения, одним из которых является:
Максимальное количество подключений в секунду для вашего экземпляра БД может быть ограничено в зависимости от класса экземпляра БД и вашей рабочей нагрузки.
Комментарии:
1. кстати, я правильно понимаю, что мне нужно создать политику , чтобы определить, каким пользователям БД разрешена авторизация, а затем прикрепить эту политику к роли задачи ? Невозможно создать отдельную роль и прикрепить ее к задаче ecs?
2. @FilipNiko Я думаю, что это должна быть роль taskExecution. Но я бы предложил сначала настроить его для тестирования в самом простом сценарии, например, протестировать пользователя IAM, если процедура новая. Для роли IAM, возможно, проще было бы протестировать использование EC2 с ролью экземпляра. Затем, когда вы освоитесь с настройкой, вы можете перейти на Fargate.
3. Хорошо, имеет смысл сначала сделать это с помощью IAM User. Спасибо
4. @FilipNiko Нет проблем. Пожалуйста, дайте мне знать, как это будет происходить.
5. Я только что доказал, что RDS IAM Auth работает для пользователя IAM. Но как сделать еще один шаг и удалить пользователя IAM и использовать только роль? Поскольку мы используем Java, мы должны вызвать RdsIamAuthTokenGenerator, но в примере они добавляют учетные данные. Я думаю, что этого можно избежать с помощью taskRole ** /** taskExecution, поэтому ECS будет иметь право напрямую вызывать auth, я прав? docs.aws.amazon.com/AmazonRDS/latest/UserGuide /…