راه اندازی IAM Anywhere با استفاده از terraform

این پست شما را در مراحل پیکربندی IamAnywhere در AWS با استفاده از Terraform و گواهیهای سفارشی راهنمایی میکند.
الزامات
- حساب AWS.
- Terraform.
دامنه
ما قصد داریم IamAnywhere را پیکربندی کنیم تا اجازه دسترسی به آن را بدهد krakenmoto
سطل در S3.
Initial steps
- پیکربندی کنید
Certificate Authority
. برای استفاده از AWS IAM در هر مکانی به گواهی X.509 نیاز داریم که توسط یک CA (مرجع صدور گواهینامه) صادر شده باشد. می توانید از اسکریپت زیر استفاده کنید تا بتوانید ایجاد کنید.Bundle-Certificate
از جملهPrivateCA.pem
وclient.key
که قرار است پس از آماده شدن زیرساخت برای پیکربندی دسترسی استفاده شوند.
certificate.sh
#!/bin/bash
SERVER="${SERVER:-client}"
OUTPUT_PATH=${OUTPUT_PATH:-certificates}
mkdir -p $OUTPUT_PATH
CORPORATION=GERSONPLACE
GROUP="Engineering"
CITY="Cartago"
STATE="Paraiso"
COUNTRY=CR
CERT_AUTH_PASS=`openssl rand -base64 32`
echo $CERT_AUTH_PASS > cert_auth_password
CERT_AUTH_PASS=`cat cert_auth_password`
cat -< config.cnf
[ req ]
distinguished_name = req_distinguished_name
attributes = req_attributes
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
0.organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, fully qualified host name)
commonName_max = 64
emailAddress = Email Address
emailAddress_max = 64
[ req_attributes ]
challengePassword = A challenge password
challengePassword_min = 4
challengePassword_max = 20
[ v3_ca ]
basicConstraints = critical, CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, cRLSign, digitalSignature, keyCertSign
[SAN]
subjectAltName=DNS:$SERVER"
EOF
echo "Create the certificate authority"
openssl genrsa -out $OUTPUT_PATH/PrivateCA.key 4096
openssl \
req \
-subj "/CN=$SERVER.ca/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
-new \
-x509 \
-passout pass:$CERT_AUTH_PASS \
-key $OUTPUT_PATH/PrivateCA.key \
-out $OUTPUT_PATH/PrivateCA.pem \
-config config.cnf \
-extensions v3_ca \
-days 36500
echo "Create client private key (used to decrypt the cert we get from the CA)"
openssl genrsa -out $OUTPUT_PATH/$SERVER.key 4096
cat -< client.ext
basicConstraints = CA:FALSE
authorityKeyIdentifier = keyid,issuer
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment
EOF
echo "Create the CSR(Certitificate Signing Request)"
openssl req -new -key $OUTPUT_PATH/$SERVER.key -out $SERVER.csr -nodes \
-subj "/CN=$SERVER/OU=$GROUP/O=$CORPORATION/L=$CITY/ST=$STATE/C=$COUNTRY" \
-sha256
echo "Sign the certificate with the certificate authority"
openssl x509 -req -in $SERVER.csr -CA $OUTPUT_PATH/PrivateCA.pem -CAkey $OUTPUT_PATH/PrivateCA.key -CAcreateserial -out $OUTPUT_PATH/$SERVER.pem \
-days 36500 \
-extfile client.ext \
-passin pass:$CERT_AUTH_PASS
اسکریپت را اجرا کنید ./certificate.sh
و گواهینامه های مورد نیاز را در داخل ایجاد می کند /certificates
پوشه
هنگامی که شما خود را دارید custom
گواهی ها آماده هستند زمان تنظیم کد terraform فرا رسیده است.
💻## terraform را نصب کنید
## OSX ##
brew install hashicorp/tap/terraform
## Windows ##
choco install terraform
## Linux ##
sudo apt-get install terraform
🛑Important
= اگر از MAC M1/M2 استفاده می کنید، احتمالاً هنگام اجرای ماژول با این خطا مواجه می شوید
⚠Error: Incompatible provider version
Provider registry.terraform.io/hashicorp/template v2.2.0 does not have a package available for your current platform, darwin_arm64.
Provider releases are separate from Terraform CLI releases, so not all providers are available for all platforms. Other versions
of this provider may have different platforms supported.
نگران نباشید اجازه می دهد تا آن را تعمیر کنید اما اجرای این 3 دستورbrew install kreuzwerker/taps/m1-terraform-provider-helper
#(در صورتی که Helper را فعال نکرده باشید)m1-terraform-provider-helper activate
#نصب و کامپایل کنیدm1-terraform-provider-helper install hashicorp/template -v 2.10.0
کد ماژول Terraform
کد منابع زیر را در AWS ایجاد می کند IAM
Trust Anchor:
در Trust Anchor، ما بین AWS IAM Role Anywhere و CA اعتماد ایجاد می کنیم. برنامهای که خارج از AWS اجرا میشود در برابر یک لنگر اعتماد با گواهی مشتری X.509 برای دریافت اعتبارنامه موقت AWS احراز هویت میشود.
IAM Role:
Trust Anchors نقش AWS IAM را برای اعطای مجوزهای مجاز خط مشی IAM بر عهده می گیرد. برای استفاده از یک نقش، باید به اصل سرویس IAM Role Anywhere در نقش اعتماد کنیم.
Profile:
در نمایه، یک نقش IAM را تعریف می کنیم که توسط مشتری به عهده می گیرد. میتوانیم با خطمشیهای مدیریتشده AWS و بلوکهای شرط، مرزهای مجوزهای اضافی را در جلسات فعال تنظیم کنیم.
در این مورد ما قصد داریم از a استفاده کنیم custom module
که همه این منابع را به یکباره ایجاد می کند، بنابراین با ایجاد شروع می شود modules/custom
پوشه شامل منابعی که terraform در AWS ایجاد می کند anchor.tf
، iam.tf
، outputs.tf
، tls-crt.tf
و variables.tf
.
anchor.tf
# Trust anchors
resource "aws_rolesanywhere_trust_anchor" "trust_anchor" {
name = "${local.project_name}-trust_anchor"
enabled = true
source {
source_data {
x509_certificate_data = file("${path.module}/certificates/PrivateCA.pem")
}
source_type = "CERTIFICATE_BUNDLE"
}
}
# Profile
resource "aws_rolesanywhere_profile" "profile" {
enabled = true
name = "${local.project_name}-profile"
role_arns = [aws_iam_role.roles.arn]
managed_policy_arns = [aws_iam_policy.profile_managed_policies.arn]
}
# Profile policies
#Managed policies limit the permissions granted by the role's permissions policy and are assigned to the role session when the role is assumed.
resource "aws_iam_policy" "profile_managed_policies" {
name = "${local.project_name}-user-profile-policies"
path = "https://dev.to/"
description = "Allows access to S3"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Action = [
"s3:*",
]
Resource = [
"arn:aws:s3:::${var.bucket_name}",
"arn:aws:s3:::${var.bucket_name}/*"
]
Effect = "Allow"
}]
})
}
iam.tf
locals {
project_name = var.project_name
}
resource "aws_iam_role" "roles" {
name = "${local.project_name}-iamanywhere-trust-role"
path = "https://dev.to/"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow",
Principal = {
Service = "rolesanywhere.amazonaws.com",
},
Action = [
"sts:AssumeRole",
"sts:TagSession",
"sts:SetSourceIdentity"
],
Condition = {
ArnEquals = {
"aws:SourceArn" = "arn:aws:rolesanywhere:${var.region}:${var.aws_account}:trust-anchor/${aws_rolesanywhere_trust_anchor.trust_anchor.id}"
}
}
}
]
})
}
# Permission policies in the role of iamanywhere-trust-role
resource "aws_iam_policy" "s3_full_access" {
name = "${local.project_name}-iamanywhere-trust-role-policies"
path = "https://dev.to/"
description = "Allows access to S3"
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Action = [
"s3:*",
]
Resource = [
"arn:aws:s3:::${var.bucket_name}",
"arn:aws:s3:::${var.bucket_name}/*"
]
Effect = "Allow"
}]
})
}
resource "aws_iam_role_policy_attachment" "roles_s3_access" {
role = aws_iam_role.roles.name
policy_arn = aws_iam_policy.s3_full_access.arn
}
outputs.tf
output "anchor" {
value = aws_rolesanywhere_trust_anchor.trust_anchor.arn
}
output "profile" {
value = aws_rolesanywhere_profile.profile.arn
}
output "awsiam" {
value = aws_iam_role.roles.arn
}
data "template_file" "aws_export_profile" {
template = <<-EOT
[profile iam_anywhere]
region=us-east-2
credential_process = aws_signing_helper credential-process --trust-anchor-arn ${aws_rolesanywhere_trust_anchor.trust_anchor.arn} --profile-arn ${aws_rolesanywhere_profile.profile.arn} --role-arn ${aws_iam_role.roles.arn} --certificate /path/client.pem --private-key /path/client.key
EOT
vars = {
trust_anchor_arn = aws_rolesanywhere_trust_anchor.trust_anchor.arn
profile_arn = aws_rolesanywhere_profile.profile.arn
role_arn = aws_iam_role.roles.arn
}
}
resource "local_file" "aws_export_profile" {
content = data.template_file.aws_export_profile.rendered
filename = "./aws-config.txt"
}
tls-crt.tf
resource "tls_private_key" "roles" {
algorithm = "RSA"
}
variables.tf
variable "aws_account" {
description = "AWS account ID"
type = string
}
variable "region" {
description = "AWS Region"
type = string
}
variable "bucket_name" {
type = string
}
variable "project_name" {
type = string
}
این 5 فایل، منابع زمینی مورد نیازی را که برای ایجاد زیرساخت AWS لازم برای دسترسی به S3 از طریق IAMA در هر جایی که میتوانید تغییر دهید، نیاز دارید، تکمیل میکنند. iam.tf
برای تنظیم دسترسی اضافی در صورت نیاز از طریق خط مشی های IAM، اما در این صورت دسترسی فقط به آن خواهد بود krakenmoto
سطلی که در آن گنجانده می شود main.tf
فایلی که ماژول بعدی را فراخوانی می کند.
در زیر نحوه ساختار فایل terraform باید به نظر برسد /certificates
پوشه در حال اجرا ./certificates
بخشی از آن است به عنوان anchor
منبع از آن می سازد.
کد Terraform که متغیرهایی را برای فراخوانی ماژول تنظیم می کند
main.tf
module "Iamanywhere" {
source = "./modules/custom"
aws_account = "112223334445"
region = "us-east-1"
bucket_name = "krakenmoto"
project_name = "gersonplace"
}
اکنون ما آماده اجرای terraform هستیم، بنابراین خود را در پوشه ای در آنجا قرار دهید main.tf
واقع شده و اجرا می شود
terraform init -reconfigure -upgrade
terraform validate
terraform plan
terraform apply
این کد موارد زیر را ایجاد می کند outputs
- `IAM Role` = ${project_name}-iamanywhere-trust-role
- `Trust Anchor` = ${project_name}-trust_anchor
- `Trust Role Policy` = ${project_name}-iamanywhere-trust-role-policies
- `Profile` = ${project_name}-profile
- `IAM Policy` = ${project_name}-user-profile-policies
هنگامی که تغییرات را در AWS اعمال کردید، یک فایل جدید با نام در پوشه شما ایجاد می شود aws-config.txt
میتوانید از دادههای موجود در آن برای ایجاد یک نمایه برای اتصال به حساب AWS خود و فشار دادن و کشیدن از آن استفاده کنید krakenmoto
سطل S3.
[profile iam_anywhere]
region=us-east-2
credential_process = aws_signing_helper credential-process --trust-anchor-arn arn:aws:rolesanywhere:us-east-2:112223334445:trust-anchor/957dd152-a4e2-4ac8-ab79-ff70ae66cf07 --profile-arn arn:aws:rolesanywhere:us-east-2:286514997612:profile/c25f019c-0234-4905-99cc-6dbeacc65b69 --role-arn arn:aws:iam::112223334445:role/gersonplace-iamanywhere-trust-role --certificate /path/client.pem --private-key /path/client.key
🛑مهم: باید استفاده کنید client.pem
و client.key
برای اینکه بتوانید از achor
برای احراز هویت