Як використовувати облікові дані для прийняття ролі AWS в Ruby

текст перекладу
Автори: Осман Окюян та Хасан Умут Яджи

pic

Вступ

У цьому блозі ми розглянемо, як використовувати AWS Assume Role (STS) облікові дані в Ruby. Використання ролей у AWS дозволяє тимчасово отримати доступ до різних облікових записів або сервісів AWS з необхідними дозволами. Це може бути особливо корисно для керування доступом та покращення безпеки в середовищах з кількома обліковими записами.

Передумови

Перш ніж ми почнемо з кодом, переконайтеся, що у вас є наступне:

  1. Обліковий запис AWS з налаштованими ролями IAM.
  2. Встановлений Ruby на вашій системі.
  3. Встановлений гем aws-sdk.

Налаштування ролей IAM

Для цього налаштування вам знадобляться дві ролі. Одна роль буде прикріплена до обчислювального ресурсу (ECS, EC2 тощо), а інша роль матиме необхідні дозволи для виконання потрібних операцій.

Довіра (Роль ресурсу)

Роль ресурсу повинна мати політику довіри, подібну до наведеної нижче.

{  
 "Version": "2012-10-17",  
 "Statement": [  
 {  
 "Effect": "Allow",  
 "Principal": {  
 "Service": "ecs-tasks.amazonaws.com"  
 },  
 "Action": "sts:AssumeRole"  
 }  
 ]  
}

Це дозволить сервісу ECS припустити іншу роль. Можливо, вам потрібно буде змінити “Service” залежно від обчислювального ресурсу. Якщо ви прикріплюєте роль до EC2 інстанції, значення повинно бути “ec2.amazonaws.com”.

Дозволи (Роль ресурсу)

Роль ресурсу також потребує політики дозволів, яка дозволяє припустити цільову роль.

{  
 "Version": "2012-10-17",  
 "Statement": [  
 {  
 "Effect": "Allow",  
 "Action": "sts:AssumeRole",  
 "Resource": "arn:aws:iam::123456789123:role/target-role-name"  
 }  
 ]  
}

Тепер, коли ми налаштували роль IAM на обчислювальному ресурсі, нам потрібно налаштувати додаткову роль з необхідними дозволами.

Довіра (Цільова роль)

Цільова роль повинна довіряти ролі ресурсу. Ви можете розширити цю політику довіри додатковими заходами безпеки, такими як зовнішній ідентифікатор (external ID).

{  
 "Version": "2012-10-17",  
 "Statement": [  
 {  
 "Effect": "Allow",  
 "Principal": {  
 "AWS": [  
 "arn:aws:iam::123456789123:role/resource-role-name"  
 ]  
 },  
 "Action": "sts:AssumeRole",  
 "Condition": {  
 "StringEquals": {  
 "sts:ExternalId": "given-external-id"  
 }  
 }  
 }  
 ]  
}

Дозволи (Цільова роль)

Ця політика дозволів, прикріплена до цільової ролі, повинна містити необхідні дозволи для відповідного сервісу AWS.
текст перекладу
S3 бакет.

{  
 "Version": "2012-10-17",  
 "Statement": [  
 {  
 "Effect": "Allow",  
 "Action": [  
 "s3:ListAllMyBuckets"  
 ],  
 "Resource": "*"  
 },  
 {  
 "Effect": "Allow",  
 "Action": [  
 "s3:ListBucket"  
 ],  
 "Resource": "arn:aws:s3:::your-bucket-name"  
 },  
 {  
 "Effect": "Allow",  
 "Action": [  
 "s3:GetObject",  
 "s3:PutObject",  
 "s3:DeleteObject"  
 ],  
 "Resource": "arn:aws:s3:::your-bucket-name/*"  
 }  
 ]  
}

Як отримати ARN ролі

Після створення ролі, ви можете отримати ARN ролі зі сторінки IAM.

pic

Налаштування AWS клієнта та припущення ролі:

require 'aws-sdk-sts'  

sts_client = Aws::STS::Client.new(  
 region: 'eu-west-1' # Змініть на потрібний регіон  
)  

role_arn = 'arn:aws:iam::ACCOUNT_ID:role/ROLE_NAME'  
role_session_name = 'my_session'  

assumed_role = sts_client.assume_role(  
 role_arn: role_arn,  
 role_session_name: role_session_name  
)  

credentials = assumed_role.credentials

Використання облікових даних припущеної ролі:

require 'aws-sdk-s3'  

# Ініціалізуємо клієнт S3 з наданими обліковими даними  
s3_client = Aws::S3::Client.new(  
 region: 'eu-west-1', # Змініть на потрібний регіон  
 access_key_id: credentials.access_key_id,  
 secret_access_key: credentials.secret_access_key,  
 session_token: credentials.session_token  
)  

# Вказуємо ім'я бакету та ключ об'єкта  
bucket_name = 'your-bucket-name'  
object_key = 'your-object-key'  

# Отримуємо об'єкт з S3  
resp = s3_client.get_object(  
 bucket: bucket_name,  
 key: object_key  
)  

puts resp.body.read
const AWS = require('aws-sdk');  

// Ініціалізуємо клієнт S3 з наданими обліковими даними  
const s3 = new AWS.S3({  
 region: 'eu-west-1', // Змініть на потрібний регіон  
 accessKeyId: credentials.access_key_id,  
 secretAccessKey: credentials.secret_access_key,  
 sessionToken: credentials.session_token  
});  

// Вказуємо ім'я бакету та ключ об'єкта  
const bucketName = 'your-bucket-name';  
const objectKey = 'your-object-key';  

// Отримуємо об'єкт з S3  
s3.getObject({ Bucket: bucketName, Key: objectKey }, (err, data) => {  
 if (err) {  
 console.error('Помилка при отриманні об'єкта:', err);  
 } else {  
 console.log('Вміст об\'єкта:', data.Body.toString());  
 }  
});

Переваги використання сесійних облікових даних

Покращена безпека

Використовуючи сесійні облікові дані, ви значно знижуєте ризик, пов'язаний з довготривалими обліковими даними. Тимчасові облікові дані діють лише протягом обмеженого часу і автоматично стають недійсними після закінчення тривалості сесії. Це мінімізує наслідки, якщо облікові дані будуть скомпрометовані.

Уникнення жорстко закодованих ключів доступу

З сесійними обліковими даними ви уникатимете необхідності жорстко закодовувати ключі доступу та секретні ключі доступу в коді. Жорстке кодування облікових даних — це ризик для безпеки, оскільки вони можуть випадково бути розкриті через репозиторії коду або логи. Натомість ви динамічно генеруєте тимчасові облікові дані під час виконання.

Висновок

Використання облікових даних Assume Role (STS) в Ruby може значно підвищити безпеку та гнучкість ваших додатків.
текст перекладу
Припускаючи ролі, ви можете ефективніше керувати правами доступу та забезпечити, щоб ваші додатки мали правильний рівень доступу до ресурсів AWS без жорсткого кодування довгострокових облікових даних.

Переконайтеся, що ваше застосування обробляє закінчення сесії коректно, щоб підтримувати безперебійний доступ до ресурсів AWS.

pic

Додаткові поради

  • Змінні середовища: Розгляньте можливість зберігання ваших облікових даних AWS у змінних середовища для забезпечення їхньої безпеки.
  • Тривалість сесії: Ви можете вказати тривалість сесії припущеної ролі, додавши параметр duration_seconds до методу assume_role.

Посилання

Перекладено з: How to Use AWS Assume Role Credentials in Ruby

Leave a Reply

Your email address will not be published. Required fields are marked *