برنامه نویسی

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

این پست شما را در مراحل پیکربندی IamAnywhere در AWS با استفاده از Terraform و گواهی‌های سفارشی راهنمایی می‌کند.

الزامات

  1. حساب AWS.
  2. Terraform.

دامنه

ما قصد داریم IamAnywhere را پیکربندی کنیم تا اجازه دسترسی به آن را بدهد krakenmoto سطل در S3.

Initial steps

  1. پیکربندی کنید 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 برای احراز هویت

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا