Лучший способ получить доступ к AWS RDS из AWS ECS Fargate

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

  1. Я подготовил свой экземпляр RDS, чтобы разрешить авторизацию IAM
  2. Я создал пользователя 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)

  1. Я создал пользователя в своей базе данных
 CREATE USER iam_user; 
GRANT rds_iam TO iam_user;
  
  1. Я протестировал соединение (после экспорта ключа доступа)
 # 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 вместо файла профиля.

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth .Подключение.Python.html

 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 /…