AWS Secrets Manager Agen - AWS Secrets Manager

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

AWS Secrets Manager Agen

AWS Secrets Manager Agen adalah HTTP layanan sisi klien yang dapat Anda gunakan untuk membakukan konsumsi rahasia dari Secrets Manager di seluruh lingkungan seperti Amazon Elastic Container Service, AWS Lambda Amazon Elastic Kubernetes Service, dan Amazon Elastic Compute Cloud. Secrets Manager Agent dapat mengambil dan menyimpan rahasia dalam memori sehingga aplikasi Anda dapat mengkonsumsi rahasia langsung dari cache. Itu berarti Anda dapat mengambil rahasia yang dibutuhkan aplikasi Anda dari localhost alih-alih melakukan panggilan ke Secrets Manager. Agen Secrets Manager hanya dapat membuat permintaan baca ke Secrets Manager - tidak dapat mengubah rahasia.

Secrets Manager Agent menggunakan AWS kredensyal yang Anda berikan di lingkungan Anda untuk melakukan panggilan ke Secrets Manager. Secrets Manager Agent menawarkan perlindungan terhadap Server Side Request Forgery (SSRF) untuk membantu meningkatkan keamanan rahasia. Anda dapat mengonfigurasi Secrets Manager Agent dengan mengatur jumlah maksimum koneksi, waktu untuk live (TTL), HTTP port localhost, dan ukuran cache.

Karena Secrets Manager Agent menggunakan cache dalam memori, maka akan disetel ulang saat Secrets Manager Agent dimulai ulang. Secrets Manager Agent secara berkala menyegarkan nilai rahasia yang di-cache. Penyegaran terjadi ketika Anda mencoba membaca rahasia dari Agen Secrets Manager setelah TTL kedaluwarsa. Frekuensi refresh default (TTL) adalah 300 detik, dan Anda dapat mengubahnya dengan menggunakan File konfigurasi yang Anda berikan ke Secrets Manager Agent menggunakan argumen baris --config perintah. Secrets Manager Agent tidak menyertakan pembatalan cache. Misalnya, jika rahasia berputar sebelum entri cache kedaluwarsa, Agen Secrets Manager mungkin mengembalikan nilai rahasia basi.

Secrets Manager Agent mengembalikan nilai rahasia dalam format yang sama dengan responsGetSecretValue. Nilai rahasia tidak dienkripsi dalam cache.

Untuk mengunduh kode sumber, lihat https://github.com/aws/aws-secretsmanager-agentdi GitHub.

Langkah 1: Bangun biner Secrets Manager Agent

Untuk membangun biner Secrets Manager Agent secara native, Anda memerlukan alat pengembangan standar dan alat Rust. Atau, Anda dapat mengkompilasi silang untuk sistem yang mendukungnya, atau Anda dapat menggunakan Rust cross untuk mengkompilasi silang.

RPM-based systems
  1. Pada sistem RPM berbasis seperti AL2 023, Anda dapat menginstal alat pengembangan dengan menggunakan grup Alat Pengembangan.

    sudo yum -y groupinstall "Development Tools"
  2. Ikuti instruksi di Install Rust dalam dokumentasi Rust.

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. Bangun agen menggunakan perintah cargo build:

    cargo build --release

    Anda akan menemukan executable di bawah. target/release/aws-secrets-manager-agent

Debian-based systems
  1. Pada sistem berbasis Debian seperti Ubuntu, Anda dapat menginstal alat pengembang menggunakan paket build-essential.

    sudo apt install build-essential
  2. Ikuti instruksi di Install Rust dalam dokumentasi Rust.

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. Bangun agen menggunakan perintah cargo build:

    cargo build --release

    Anda akan menemukan executable di bawah. target/release/aws-secrets-manager-agent

Windows

Untuk membangun di Windows, ikuti petunjuk di Siapkan lingkungan dev Anda di Windows for Rust dalam dokumentasi Microsoft Windows.

Cross-compile natively

Pada distribusi di mana paket mingw-w64 tersedia seperti Ubuntu, Anda dapat melakukan kompilasi silang secara native.

# Install the cross compile tool chain sudo add-apt-repository universe sudo apt install -y mingw-w64 # Install the rust build targets rustup target add x86_64-pc-windows-gnu # Cross compile the agent for Windows cargo build --release --target x86_64-pc-windows-gnu

Anda akan menemukan executable di. target/x86_64-pc-windows-gnu/release/aws-secrets-manager-agent.exe

Cross compile with Rust cross

Jika alat kompilasi silang tidak tersedia secara asli di sistem, Anda dapat menggunakan proyek silang Rust. Untuk informasi lebih lanjut, lihat https://github.com/cross-rs/silang.

penting

Kami merekomendasikan ruang disk 32GB untuk lingkungan build.

# Install and start docker sudo yum -y install docker sudo systemctl start docker sudo systemctl enable docker # Make docker start after reboot # Give ourselves permission to run the docker images without sudo sudo usermod -aG docker $USER newgrp docker # Install cross and cross compile the executable cargo install cross cross build --release --target x86_64-pc-windows-gnu

Langkah 2: Instal Agen Secrets Manager

Berdasarkan jenis komputasi, Anda memiliki beberapa opsi untuk menginstal Secrets Manager Agent.

Amazon EKS, Amazon EC2, and Amazon ECS
Untuk menginstal Agen Secrets Manager
  1. Gunakan install skrip yang disediakan di repositori.

    Skrip menghasilkan SSRF token acak saat startup dan menyimpannya dalam file/var/run/awssmatoken. Token dapat dibaca oleh awssmatokenreader grup yang dibuat oleh skrip penginstalan.

  2. Untuk memungkinkan aplikasi Anda membaca file token, Anda perlu menambahkan akun pengguna yang dijalankan aplikasi Anda ke awssmatokenreader grup. Misalnya, Anda dapat memberikan izin untuk aplikasi Anda untuk membaca file token dengan perintah usermod berikut, di mana <APP_USER> ID pengguna tempat aplikasi Anda berjalan.

    sudo usermod -aG awssmatokenreader <APP_USER>
Docker

Anda dapat menjalankan Secrets Manager Agent sebagai wadah sespan bersama aplikasi Anda dengan menggunakan Docker. Kemudian aplikasi Anda dapat mengambil rahasia dari HTTP server lokal yang disediakan Agen Secrets Manager. Untuk informasi tentang Docker, lihat dokumentasi Docker.

Untuk membuat wadah sespan untuk Secrets Manager Agent dengan Docker
  1. Buat Dockerfile untuk wadah sidecar Secrets Manager Agent. Contoh berikut membuat wadah Docker dengan biner Secrets Manager Agent.

    # Use the latest Debian image as the base FROM debian:latest # Set the working directory inside the container WORKDIR /app # Copy the Secrets Manager Agent binary to the container COPY secrets-manager-agent . # Install any necessary dependencies RUN apt-get update && apt-get install -y ca-certificates # Set the entry point to run the Secrets Manager Agent binary ENTRYPOINT ["./secrets-manager-agent"]
  2. Buat Dockerfile untuk aplikasi klien Anda.

  3. Buat file Docker Compose untuk menjalankan kedua kontainer, pastikan mereka menggunakan antarmuka jaringan yang sama. Hal ini diperlukan karena Secrets Manager Agent tidak menerima permintaan dari luar antarmuka localhost. Contoh berikut menunjukkan file Docker Compose di mana network_mode kunci melampirkan secrets-manager-agent wadah ke namespace jaringan client-application wadah, yang memungkinkan mereka untuk berbagi antarmuka jaringan yang sama.

    penting

    Anda harus memuat AWS kredensi dan SSRF token agar aplikasi dapat menggunakan Secrets Manager Agent. Lihat yang berikut ini:

    version: '3' services: client-application: container_name: client-application build: context: . dockerfile: Dockerfile.client command: tail -f /dev/null # Keep the container running secrets-manager-agent: container_name: secrets-manager-agent build: context: . dockerfile: Dockerfile.agent network_mode: "container:client-application" # Attach to the client-application container's network depends_on: - client-application
  4. Salin secrets-manager-agent biner ke direktori yang sama yang berisi file Dockerfiles dan Docker Compose Anda.

  5. Bangun dan jalankan kontainer berdasarkan Dockerfiles yang disediakan dengan menggunakan perintah berikut docker-compose.

    docker-compose up --build
  6. Dalam wadah klien Anda, Anda sekarang dapat menggunakan Secrets Manager Agent untuk mengambil rahasia. Untuk informasi selengkapnya, lihat Langkah 3: Ambil rahasia dengan Agen Secrets Manager.

AWS Lambda

Anda dapat mengemas Secrets Manager Agent sebagai AWS Lambda ekstensi. Kemudian Anda dapat menambahkannya ke fungsi Lambda Anda sebagai lapisan dan memanggil Secrets Manager Agent dari fungsi Lambda Anda untuk mendapatkan rahasia.

Petunjuk berikut menunjukkan cara mendapatkan rahasia bernama MyTest dengan menggunakan skrip secrets-manager-agent-extension.sh contoh https://github.com/aws/aws-secretsmanager-agentuntuk menginstal Secrets Manager Agent sebagai ekstensi Lambda.

catatan

Contoh skrip menggunakan curl perintah, yang disertakan dengan runtime berbasis Amazon Linux 2023 seperti Python 3.12 dan Node.js 20. Jika Anda menggunakan lingkungan runtime berbasis Amazon Linux 2 seperti Python 3.11 atau Node.js 18, Anda harus menginstal terlebih dahulu curl di image kontainer Lambda Anda. Untuk petunjuk, lihat Bagaimana cara menggunakan paket biner AMI asli Amazon Linux 2 dengan Lambda di AWS re:post.

Untuk membuat ekstensi Lambda yang mengemas Agen Secrets Manager
  1. Buat fungsi Lambda Python yang meminta untuk mendapatkan rahasia. http://localhost:2773/secretsmanager/get?secretId=MyTest Pastikan untuk menerapkan logika coba lagi dalam kode aplikasi Anda untuk mengakomodasi penundaan inisialisasi dan pendaftaran ekstensi Lambda.

  2. Dari root paket kode Agen Secrets Manager, jalankan perintah berikut untuk menguji ekstensi Lambda.

    AWS_ACCOUNT_ID=<AWS_ACCOUNT_ID> LAMBDA_ARN=<LAMBDA_ARN> # Build the release binary cargo build --release --target=x86_64-unknown-linux-gnu # Copy the release binary into the `bin` folder mkdir -p ./bin cp ./target/x86_64-unknown-linux-gnu/release/aws_secretsmanager_agent ./bin/secrets-manager-agent # Copy the `secrets-manager-agent-extension.sh` script into the `extensions` folder. mkdir -p ./extensions cp aws_secretsmanager_agent/examples/example-lambda-extension/secrets-manager-agent-extension.sh ./extensions # Zip the extension shell script and the binary zip secrets-manager-agent-extension.zip bin/* extensions/* # Publish the layer version LAYER_VERSION_ARN=$(aws lambda publish-layer-version \ --layer-name secrets-manager-agent-extension \ --zip-file "fileb://secrets-manager-agent-extension.zip" | jq -r '.LayerVersionArn') # Attach the layer version to the Lambda function aws lambda update-function-configuration \ --function-name $LAMBDA_ARN \ --layers "$LAYER_VERSION_ARN"
  3. Memanggil fungsi Lambda untuk memverifikasi bahwa rahasia sedang diambil dengan benar.

Langkah 3: Ambil rahasia dengan Agen Secrets Manager

Untuk menggunakan agen, Anda memanggil titik akhir Secrets Manager Agent lokal dan menyertakan nama atau ARN rahasia sebagai parameter kueri. Secara default, Secrets Manager Agent mengambil AWSCURRENT versi rahasia. Untuk mengambil versi yang berbeda, Anda dapat mengatur versionStage atauversionId.

Untuk membantu melindungi Agen Secrets Manager, Anda harus menyertakan header SSRF token sebagai bagian dari setiap permintaan: X-Aws-Parameters-Secrets-Token Agen Secrets Manager menolak permintaan yang tidak memiliki header ini atau yang memiliki token tidak validSSRF. Anda dapat menyesuaikan nama SSRF header di fileFile konfigurasi.

Secrets Manager Agent menggunakan AWS SDK for Rust, yang menggunakan rantai penyedia kredensyal default. Identitas IAM kredensyal ini menentukan izin yang dimiliki Agen Secrets Manager untuk mengambil rahasia.

Izin yang diperlukan:

  • secretsmanager:DescribeSecret

  • secretsmanager:GetSecretValue

Untuk informasi selengkapnya, lihat Referensi izin.

penting

Setelah nilai rahasia ditarik ke Agen Secrets Manager, setiap pengguna dengan akses ke lingkungan komputasi dan SSRF token dapat mengakses rahasia dari cache Agen Secrets Manager. Untuk informasi selengkapnya, lihat Pertimbangan keamanan.

curl

Contoh curl berikut menunjukkan cara mendapatkan rahasia dari Secrets Manager Agent. Contohnya bergantung pada SSRF keberadaan dalam file, yang merupakan tempat ia disimpan oleh skrip instalasi.

curl -v -H \ "X-Aws-Parameters-Secrets-Token: $(</var/run/awssmatoken)" \ 'http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>'; \ echo
Python

Contoh Python berikut menunjukkan cara mendapatkan rahasia dari Secrets Manager Agent. Contohnya bergantung pada SSRF keberadaan dalam file, yang merupakan tempat ia disimpan oleh skrip instalasi.

import requests import json # Function that fetches the secret from Secrets Manager Agent for the provided secret id. def get_secret(): # Construct the URL for the GET request url = f"http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>" # Get the SSRF token from the token file with open('/var/run/awssmatoken') as fp: token = fp.read() headers = { "X-Aws-Parameters-Secrets-Token": token.strip() } try: # Send the GET request with headers response = requests.get(url, headers=headers) # Check if the request was successful if response.status_code == 200: # Return the secret value return response.text else: # Handle error cases raise Exception(f"Status code {response.status_code} - {response.text}") except Exception as e: # Handle network errors raise Exception(f"Error: {e}")

Konfigurasikan Agen Secrets Manager

Untuk mengubah konfigurasi Agen Secrets Manager, buat file TOMLkonfigurasi, lalu panggil./aws-secrets-manager-agent --config config.toml.

Daftar berikut menunjukkan opsi yang dapat Anda konfigurasikan untuk Agen Secrets Manager.

  • log_level — Tingkat detail yang dilaporkan dalam log untuk Agen Secrets Manager:DEBUG,,, INFO WARNERROR, atau. NONE Default-nya adalah INFO.

  • http_port — Port untuk HTTP server lokal, dalam kisaran 1024 hingga 65535. Defaultnya adalah 2773.

  • wilayah — AWS Wilayah yang akan digunakan untuk permintaan. Jika tidak ada Region yang ditentukan, Secrets Manager Agent menentukan Region dariSDK. Untuk informasi selengkapnya, lihat Menentukan kredensyal dan Wilayah default Anda di Panduan Pengembang AWS SDK untuk Rust.

  • ttl_seconds - TTL Dalam hitungan detik untuk item yang di-cache, dalam kisaran 1 hingga 3600. Angka default-nya adalah 300. Pengaturan ini tidak digunakan jika ukuran cache adalah 0.

  • cache_size — Jumlah maksimum rahasia yang dapat disimpan dalam cache, dalam kisaran 0 hingga 1000. 0 menunjukkan bahwa tidak ada caching. Defaultnya adalah 1000.

  • ssrf_headers — Daftar nama header yang diperiksa Agen Secrets Manager untuk token. SSRF Defaultnya adalah “X-Aws-Parameters-Secrets-Token,”. X-Vault-Token

  • ssrf_env_variables — Daftar nama variabel lingkungan yang diperiksa oleh Secrets Manager Agent untuk token. SSRF Variabel lingkungan dapat berisi token atau referensi ke file token seperti pada:AWS_TOKEN=file:///var/run/awssmatoken. Defaultnya adalah "AWS_TOKEN, AWS_SESSION _TOKEN”.

  • path_prefix — URI Awalan yang digunakan untuk menentukan apakah permintaan adalah permintaan berbasis jalur. Defaultnya adalah “/v1/”.

  • max_conn — Jumlah maksimum koneksi dari HTTP klien yang diizinkan oleh Agen Secrets Manager, dalam kisaran 1 hingga 1000. Defaultnya adalah 800.

Pencatatan log

Secrets Manager Agent mencatat kesalahan secara lokal ke filelogs/secrets_manager_agent.log. Ketika aplikasi Anda memanggil Agen Secrets Manager untuk mendapatkan rahasia, panggilan tersebut muncul di log lokal. Mereka tidak muncul di CloudTrail log.

Secrets Manager Agent membuat file log baru ketika file mencapai 10 MB, dan menyimpan hingga lima file log total.

Log tidak masuk ke Secrets Manager, CloudTrail, atau CloudWatch. Permintaan untuk mendapatkan rahasia dari Agen Secrets Manager tidak muncul di log tersebut. Ketika Agen Secrets Manager melakukan panggilan ke Secrets Manager untuk mendapatkan rahasia, panggilan itu direkam CloudTrail dengan string agen pengguna yang berisiaws-secrets-manager-agent.

Anda dapat mengonfigurasi login di fileFile konfigurasi.

Pertimbangan keamanan

Untuk arsitektur agen, domain kepercayaan adalah tempat titik akhir agen dan SSRF token dapat diakses, yang biasanya merupakan seluruh host. Domain kepercayaan untuk Agen Secrets Manager harus sesuai dengan domain tempat kredensyal Secrets Manager tersedia untuk mempertahankan postur keamanan yang sama. Misalnya, di Amazon EC2 domain kepercayaan untuk Agen Secrets Manager akan sama dengan domain kredensialnya saat menggunakan peran untuk Amazon. EC2

Aplikasi sadar keamanan yang belum menggunakan solusi agen dengan kredensyal Secrets Manager yang dikunci ke aplikasi harus mempertimbangkan untuk menggunakan solusi khusus bahasa AWS SDKs atau caching. Untuk informasi selengkapnya, lihat Dapatkan rahasia dari AWS Secrets Manager.