برنامه نویسی

دعوت های URL Lambda AWS با احراز هویت IAM و محدودیت های پرتاب

تصویر توسط svstudioart در freepik

مقدمه:

این پست وبلاگ جزئیات چگونگی فراخوانی ایمن از توابع Lambda AWS را با استفاده از URL های Lambda با تأیید هویت AWS IAM و محدودیت های پرتاب برای اضافه کردن امنیت بیشتر به عملکرد Lambda ارائه می دهد. این شامل تنظیم زیرساخت های لازم با استفاده از AWS CloudFormation ، تولید AWS Signature نسخه 4 برای درخواست های تأیید شده و آزمایش تنظیمات با استفاده از خط فرمان و ابزار تست مانند Postman است.

درباره پروژه:

از سناریوی مورد استفاده کنید: فراخوانی توابع لامبدا از محیط های مختلف. این تنظیم اجازه می دهد تا توابع Lambda از محیط های مختلف ، از جمله زیرساخت های غیر AWS ، مانند محیط های محلی ، سرورهای داخلی استفاده شود.

برای درخواست های غیرمجاز یا لرزان که از عملکرد لامبدا استفاده نمی کنند ، هیچ هزینه ای متحمل نمی شود. در اینجا نکات کلیدی:

فشار و همزمان: تنظیم ReservedConcurrentExecutions تعداد اعدام های همزمان را محدود می کند. در صورت رسیدن به حد مجاز ، درخواست های اضافی مورد بررسی قرار می گیرد و برای این درخواست های پرتاب هیچ هزینه ای متحمل نمی شود.
شکست های مجوز: درخواستهایی که به دلیل خطاهای مجوز (به عنوان مثال ، اعتبار IAM نامعتبر) شکست می خورند ، منجر به فراخوانی عملکرد لامبدا نمی شوند. این درخواست ها فقط توسط سرویس IAM انجام می شود و هیچ هزینه ای برای این درخواست های غیرمجاز متحمل نمی شود.
امنیت اضافی: AWS Shield Standard به طور خودکار برای توابع Lambda در دسترس است. اطلاعات بیشتر را می توان در اینجا یافت.
نظارت: نظارت بر عملکرد لامبدا می تواند با ایجاد زنگ هشدار CloudWatch بر اساس متریک “دریچه گاز” مفید باشد.

منابع و پیوندهای مفید:
تأیید اعتبار مستندات: AWS S3 – درخواست های تأیید اعتبار.
نمونه هایی از ایجاد امضاهای AWS SIGV4 در زبان های مختلف برنامه نویسی: نمونه های امضای AWS SIGV4.
توجه: URL های عملکردی در برخی از مناطق پشتیبانی نمی شوند. اطلاعات بیشتر را می توان در اینجا یافت.

طرحواره زیرساختی

در generate_sigv4.sh فیلمنامه:

    #!/bin/sh

    # Request parameters
    METHOD="POST"
    SERVICE="lambda"
    REQUEST_PAYLOAD='{"inputText": "Request to Lambda."}'  # simple payload

    # Environment variables
    AWS_ACCESS_KEY=$AWS_ACCESS_KEY_ID
    AWS_SECRET_KEY=$AWS_SECRET_ACCESS_KEY
    REGION=$AWS_REGION
    HOST=$LAMBDA_FUNCTION_HOST
    ENDPOINT="https://${HOST}/"

    # Check if environment variables are set
    if [ -z "$AWS_ACCESS_KEY" ] || [ -z "$AWS_SECRET_KEY" ] || [ -z "$HOST" ]; then
      echo "Error: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and LAMBDA_FUNCTION_HOST must be set as environment variables."
      exit 1
    fi

    # Get the current date and time
    AMZ_DATE=$(date -u +"%Y%m%dT%H%M%SZ")
    DATE_STAMP=$(date -u +"%Y%m%d")

    # Create a canonical request
    CANONICAL_URI="https://dev.to/"
    CANONICAL_QUERYSTRING=""
    CANONICAL_HEADERS="content-type:application/json\nhost:${HOST}\nx-amz-date:${AMZ_DATE}\n"
    SIGNED_HEADERS="content-type;host;x-amz-date"
    PAYLOAD_HASH=$(printf "$REQUEST_PAYLOAD" | openssl dgst -sha256 | sed 's/^.* //')
    CANONICAL_REQUEST="${METHOD}\n${CANONICAL_URI}\n${CANONICAL_QUERYSTRING}\n${CANONICAL_HEADERS}\n${SIGNED_HEADERS}\n${PAYLOAD_HASH}"

    # Create a string to sign
    ALGORITHM="AWS4-HMAC-SHA256"
    CREDENTIAL_SCOPE="${DATE_STAMP}/${REGION}/${SERVICE}/aws4_request"
    STRING_TO_SIGN="${ALGORITHM}\n${AMZ_DATE}\n${CREDENTIAL_SCOPE}\n$(printf "$CANONICAL_REQUEST" | openssl dgst -sha256 | sed 's/^.* //')"

    # Create the signing key
    kSecret=$(printf "AWS4${AWS_SECRET_KEY}" | xxd -p -c 256)
    kDate=$(printf "${DATE_STAMP}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kSecret" | sed 's/^.* //')
    kRegion=$(printf "${REGION}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kDate" | sed 's/^.* //')
    kService=$(printf "${SERVICE}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kRegion" | sed 's/^.* //')
    kSigning=$(printf "aws4_request" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kService" | sed 's/^.* //')

    # Create the signature
    SIGNATURE=$(printf "$STRING_TO_SIGN" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"$kSigning" | sed 's/^.* //')

    # Create the authorization header
    AUTHORIZATION_HEADER="${ALGORITHM} Credential=${AWS_ACCESS_KEY}/${CREDENTIAL_SCOPE}, SignedHeaders=${SIGNED_HEADERS}, Signature=${SIGNATURE}"

    # Output the necessary information for test tool like Postman
    echo  "Endpoint: ${ENDPOINT}\n"
    echo  "x-amz-date: ${AMZ_DATE}\n"
    echo  "Authorization: ${AUTHORIZATION_HEADER}\n"
    echo  "Payload: ${REQUEST_PAYLOAD}\n"

    # Output the curl command
    echo  "curl -X ${METHOD} \"${ENDPOINT}\" -H \"Content-Type: application/json\" -H \"x-amz-date: ${AMZ_DATE}\" -H \"Authorization: ${AUTHORIZATION_HEADER}\" -d '${REQUEST_PAYLOAD}'\n"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پیش نیازها:

قبل از شروع ، اطمینان حاصل کنید که شرایط زیر برآورده می شود:

  • یک حساب AWS با مجوزهای ایجاد منابع.
  • AWS CLI https://aws.amazon.com/cli/ نصب شده در دستگاه محلی.
  • OpenSSL نصب شده در محیط آزمایش.

استقرار:

1. مخزن را کلون کنید.

    git clone https://gitlab.com/Andr1500/lambda-url-with-iam-auth.git
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

2. سهمیه اعدام همزمان عملکرد لامبدا را بررسی کرده و افزایش دهید (در صورت لزوم).

    aws service-quotas get-service-quota \
        --service-code lambda \
        --quota-code L-B99A9384

    aws service-quotas request-service-quota-increase \
        --service-code lambda \
        --quota-code L-B99A9384 \
        --desired-value 100
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

3. در تمام پارامترهای لازم در الگوی زیرساخت/root.yAML cloudformation و ایجاد پشته CloudFormation.

    aws cloudformation create-stack \
        --stack-name invoke-lambda-url-iam-auth \
        --template-body file://infrastructure/root.yaml \
        --capabilities CAPABILITY_NAMED_IAM \
        --disable-rollback
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

4. برای تنظیم متغیرهای محیط ، بازده خروجی ها را انجام دهید.

    aws cloudformation describe-stacks \
        --stack-name invoke-lambda-url-iam-auth \
        --query "Stacks[0].Outputs" --output json
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

5.SET SETION منطقه ، میزبان عملکرد Lambda ، دسترسی و کلیدهای مخفی برای کاربر ایجاد شده IAM به عنوان متغیرهای محیط در محیط آزمایش.

    export AWS_ACCESS_KEY_ID=
    export AWS_SECRET_ACCESS_KEY=
    export AWS_REGION=
    export LAMBDA_FUNCTION_HOST=
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

6. تولید AWS Signature V4 و درخواست ارسال را با استفاده از generate_sigv4.sh فیلمنامه

    ./generate_sigv4.sh

    curl -X POST "https://...on.aws/" -H "Content-Type: application/json" -H "x-amz-date: 20240619T150022Z" -H "Authorization: AWS4-HMAC-SHA256 Credential=/20240619//lambda/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=" -d '{"inputText": "Request to Lambda."}'
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

آزمایش از خط فرمان و پستچی:

*امضاء و درخواست URL عملکرد Lambda از CLI*

*درخواست از پستچی ، پاسخ صحیح*

درخواست از پستچی ، امضای منقضی شده است

درخواست از پستچی ، هدر نادرست است

7. پشته CloudFormation را حذف کنید.

    aws cloudformation delete-stack --stack-name invoke-lambda-url-iam-auth
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نتیجه گیری:

این پروژه نشان می دهد که چگونه می توان با استفاده از URL های Lambda با تأیید هویت IAM ، عملکردهای AWS Lambda را به طور ایمن فراخوانی کرد. امنیت اضافی را می توان با محدودیت های پرتاب و نظارت بر عملکرد Lambda با آلارم CloudWatch اضافه کرد.

اگر این پست را مفید و جالب دیدید ، لطفاً روی دکمه کلیک کنید تا پشتیبانی خود را نشان دهید. در صورت تمایل به استفاده و به اشتراک گذاشتن این پست. 🙂

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

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

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

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