Akses host bastion menggunakan Session Manager dan Amazon EC2 Instance Connect - AWS Prescriptive Guidance

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

Akses host bastion menggunakan Session Manager dan Amazon EC2 Instance Connect

Piotr Chotkowski dan Witold Kowalik, Amazon Web Services

Ringkasan

Sebuah bastion host, kadang-kadang disebut jump box, adalah server yang menyediakan satu titik akses dari jaringan eksternal ke sumber daya yang terletak di jaringan pribadi. Server yang terpapar ke jaringan publik eksternal, seperti internet, menimbulkan risiko keamanan potensial untuk akses yang tidak sah. Sangat penting untuk mengamankan dan mengontrol akses ke server ini.

Pola ini menjelaskan cara Anda dapat menggunakan Session Manager dan Amazon EC2 Instance Connect untuk terhubung dengan aman ke host bastion Amazon Elastic Compute Cloud EC2 (Amazon) yang digunakan di host Anda. Akun AWS Session Manager adalah kemampuan AWS Systems Manager. Manfaat dari pola ini meliputi:

  • Host benteng yang dikerahkan tidak memiliki port terbuka dan masuk yang terpapar ke internet publik. Ini mengurangi permukaan serangan potensial.

  • Anda tidak perlu menyimpan dan memelihara kunci Secure Shell (SSH) jangka panjang di dalam. Akun AWS Sebagai gantinya, setiap pengguna menghasilkan key pair SSH baru setiap kali mereka terhubung ke host bastion. AWS Identity and Access Management (IAM) kebijakan yang dilampirkan pada AWS kredensyal pengguna mengontrol akses ke host bastion.

Audiens yang dituju

Pola ini ditujukan untuk pembaca yang memiliki pengalaman dengan pemahaman dasar tentang Amazon EC2, Amazon Virtual Private Cloud (Amazon VPC), dan Hashicorp Terraform.

Prasyarat dan batasan

Prasyarat

Batasan

  • Pola ini dimaksudkan sebagai bukti konsep (PoC) atau sebagai dasar untuk pengembangan lebih lanjut. Seharusnya tidak digunakan dalam bentuknya saat ini di lingkungan produksi. Sebelum penerapan, sesuaikan kode sampel di repositori untuk memenuhi persyaratan dan kasus penggunaan Anda.

  • Pola ini mengasumsikan bahwa target bastion host menggunakan Amazon Linux 2 sebagai sistem operasinya. Meskipun dimungkinkan untuk menggunakan Amazon Machine Images (AMIs) lainnya, sistem operasi lain berada di luar cakupan untuk pola ini.

    catatan

    Amazon Linux 2 mendekati akhir dukungan. Untuk informasi selengkapnya, lihat Amazon Linux 2 FAQs.

  • Dalam pola ini, host benteng terletak di subnet pribadi tanpa gateway NAT dan gateway internet. Desain ini mengisolasi EC2 instance Amazon dari internet publik. Anda dapat menambahkan konfigurasi jaringan tertentu yang memungkinkannya berkomunikasi dengan internet. Untuk informasi selengkapnya, lihat Connect virtual private cloud (VPC) Anda ke jaringan lain dalam dokumentasi Amazon VPC. Demikian pula, mengikuti prinsip hak istimewa terkecil, host bastion tidak memiliki akses ke sumber daya lain di Anda Akun AWS kecuali Anda secara eksplisit memberikan izin. Untuk informasi selengkapnya, lihat Kebijakan berbasis sumber daya dalam dokumentasi IAM.

Versi produk

  • AWS CLI versi 2

  • Terraform versi 1.3.9

Arsitektur

Tumpukan teknologi target

  • VPC dengan subnet pribadi tunggal

  • Antarmuka berikut titik akhir VPC:

    • amazonaws.<region>.ssm— Titik akhir untuk AWS Systems Manager layanan.

    • amazonaws.<region>.ec2messages— Systems Manager menggunakan endpoint ini untuk melakukan panggilan dari Agen SSM ke layanan Systems Manager.

    • amazonaws.<region>.ssmmessages— Session Manager menggunakan endpoint ini untuk terhubung ke EC2 instans Amazon Anda melalui saluran data yang aman.

  • EC2 Instans t3.nano Amazon yang menjalankan Amazon Linux 2

  • Peran IAM dan profil contoh

  • Grup keamanan Amazon VPC dan aturan grup keamanan untuk titik akhir dan instans Amazon EC2

Arsitektur target

Diagram arsitektur menggunakan Session Manager untuk mengakses host bastion.

Diagram menunjukkan proses berikut:

  1. Pengguna mengasumsikan peran IAM yang memiliki izin untuk melakukan hal berikut:

    • Mengautentikasi, mengotorisasi, dan menghubungkan ke instans Amazon EC2

    • Memulai sesi dengan Manajer Sesi

  2. Pengguna memulai sesi SSH melalui Session Manager.

  3. Session Manager mengautentikasi pengguna, memverifikasi izin dalam kebijakan IAM terkait, memeriksa pengaturan konfigurasi, dan mengirim pesan ke Agen SSM untuk membuka koneksi dua arah.

  4. Pengguna mendorong kunci publik SSH ke host benteng melalui metadata Amazon. EC2 Ini harus dilakukan sebelum setiap koneksi. Kunci publik SSH tetap tersedia selama 60 detik.

  5. Host benteng berkomunikasi dengan titik akhir VPC antarmuka untuk Systems Manager dan Amazon. EC2

  6. Pengguna mengakses host bastion melalui Session Manager dengan menggunakan saluran komunikasi dua arah terenkripsi TLS 1.2.

Otomatisasi dan skala

Opsi berikut tersedia untuk mengotomatiskan penerapan atau untuk menskalakan arsitektur ini:

  • Anda dapat menerapkan arsitektur melalui pipeline continuous integration dan continuous delivery (CI/CD).

  • Anda dapat memodifikasi kode untuk mengubah jenis instance dari host bastion.

  • Anda dapat memodifikasi kode untuk menyebarkan beberapa host bastion. Dalam bastion-host/main.tf file, di blok aws_instance sumber daya, tambahkan count meta-argumen. Untuk informasi selengkapnya, lihat dokumentasi Terraform.

Alat

Layanan AWS

  • AWS Command Line Interface (AWS CLI) adalah alat open source yang membantu Anda berinteraksi Layanan AWS melalui perintah di shell baris perintah Anda.

  • Amazon Elastic Compute Cloud (Amazon EC2) menyediakan kapasitas komputasi yang dapat diskalakan di. AWS Cloud Anda dapat meluncurkan server virtual sebanyak yang Anda butuhkan dan dengan cepat meningkatkannya ke atas atau ke bawah.

  • AWS Identity and Access Management (IAM) membantu Anda mengelola akses ke AWS sumber daya dengan aman dengan mengontrol siapa yang diautentikasi dan diberi wewenang untuk menggunakannya.

  • AWS Systems Managermembantu Anda mengelola aplikasi dan infrastruktur yang berjalan di AWS Cloud. Ini menyederhanakan aplikasi dan manajemen sumber daya, mempersingkat waktu untuk mendeteksi dan menyelesaikan masalah operasional, dan membantu Anda mengelola AWS sumber daya Anda dengan aman dalam skala besar. Pola ini menggunakan Session Manager, kemampuan Systems Manager.

  • Amazon Virtual Private Cloud (Amazon VPC) membantu Anda meluncurkan AWS sumber daya ke jaringan virtual yang telah Anda tentukan. Jaringan virtual ini menyerupai jaringan tradisional yang akan Anda operasikan di pusat data Anda sendiri, dengan manfaat menggunakan infrastruktur yang dapat diskalakan. AWS

Alat lainnya

  • HashiCorp Terraform adalah alat infrastruktur sebagai kode (IAc) yang membantu Anda menggunakan kode untuk menyediakan dan mengelola infrastruktur dan sumber daya cloud. Pola ini menggunakan Terraform CLI.

Repositori kode

Kode untuk pola ini tersedia di host GitHub Access a bastion dengan menggunakan Session Manager dan Amazon EC2 Instance Connect repositori.

Praktik terbaik

  • Sebaiknya gunakan alat pemindaian kode otomatis untuk meningkatkan keamanan dan kualitas kode. Pola ini dipindai dengan menggunakan Checkov, alat analisis kode statis untuk IAc. Minimal, kami menyarankan Anda melakukan pemeriksaan validasi dan pemformatan dasar dengan menggunakan perintah terraform validate dan terraform fmt -check -recursive Terraform.

  • Ini adalah praktik yang baik untuk menambahkan tes otomatis untuk IAc. Untuk informasi lebih lanjut tentang berbagai pendekatan untuk menguji kode Terraform, lihat Menguji HashiCorp Terraform (posting blog Terraform).

  • Selama penerapan, Terraform menggunakan instans pengganti EC2 Amazon setiap kali versi baru AMI Amazon Linux 2 terdeteksi. Ini menyebarkan versi baru dari sistem operasi, termasuk tambalan dan peningkatan. Jika jadwal penerapan jarang terjadi, ini dapat menimbulkan risiko keamanan karena instance tidak memiliki tambalan terbaru. Penting untuk sering memperbarui dan menerapkan tambalan keamanan ke instans Amazon EC2 yang diterapkan. Untuk informasi selengkapnya, lihat Memperbarui manajemen di Amazon EC2.

  • Karena pola ini adalah bukti konsep, ia menggunakan kebijakan AWS terkelola, sepertiAmazonSSMManagedInstanceCore. AWS kebijakan terkelola mencakup kasus penggunaan umum tetapi tidak memberikan izin hak istimewa paling sedikit. Jika diperlukan untuk kasus penggunaan Anda, sebaiknya Anda membuat kebijakan khusus yang memberikan izin hak istimewa paling sedikit untuk sumber daya yang digunakan dalam arsitektur ini. Untuk informasi selengkapnya, lihat Memulai kebijakan AWS terkelola dan beralih ke izin hak istimewa paling sedikit.

  • Gunakan kata sandi untuk melindungi akses ke kunci SSH dan menyimpan kunci di lokasi yang aman.

  • Siapkan logging dan monitoring untuk host bastion. Pencatatan dan pemantauan adalah bagian penting dari pemeliharaan sistem, baik dari perspektif operasional maupun keamanan. Ada beberapa cara untuk memantau koneksi dan aktivitas di host bastion Anda. Untuk informasi selengkapnya, lihat topik berikut dalam dokumentasi Systems Manager:

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Kloning repositori kode.

  1. Di antarmuka baris perintah, ubah direktori kerja Anda ke lokasi tempat Anda ingin menyimpan file sampel.

  2. Masukkan perintah berikut.

    git clone https://github.com/aws-samples/secured-bastion-host-terraform.git

DevOps insinyur, Pengembang

Inisialisasi direktori kerja Terraform.

Langkah ini diperlukan hanya untuk penerapan pertama. Jika Anda menerapkan kembali pola, lompat ke langkah berikutnya.

Di direktori root repositori kloning, masukkan perintah berikut, di mana:

  • $S3_STATE_BUCKETadalah nama bucket Amazon S3 yang berisi status Terraform

  • $PATH_TO_STATE_FILEadalah kunci ke file status Terraform, seperti infra/bastion-host/tetfstate

  • $AWS_REGIONadalah Wilayah tempat bucket Amazon S3 digunakan

terraform init \ -backend-config="bucket=$S3_STATE_BUCKET" \ -backend-config="key=$PATH_TO_STATE_FILE" \ -backend-config="region=$AWS_REGION
catatan

Atau, Anda dapat membuka file config.tf dan, di terraform bagian tersebut, memberikan nilai-nilai ini secara manual.

DevOps insinyur, Pengembang, Terraform

Menyebarkan sumber daya.

  1. Di direktori root repositori kloning, masukkan perintah berikut.

    terraform apply -var-file="dev.tfvars"
  2. Tinjau daftar semua perubahan yang akan diterapkan ke Anda Akun AWS, dan kemudian konfirmasikan penerapan.

  3. Tunggu hingga semua sumber daya dikerahkan.

DevOps insinyur, Pengembang, Terraform
TugasDeskripsiKeterampilan yang dibutuhkan

Konfigurasikan koneksi SSH.

Perbarui file konfigurasi SSH untuk memungkinkan koneksi SSH melalui Session Manager. Untuk petunjuk, lihat Mengizinkan koneksi SSH untuk Pengelola Sesi. Hal ini memungkinkan pengguna yang berwenang untuk memasukkan perintah proxy yang memulai sesi Session Manager dan mentransfer semua data melalui koneksi dua arah.

DevOps insinyur

Hasilkan kunci SSH.

Masukkan perintah berikut untuk menghasilkan private dan public SSH key pair lokal. Anda menggunakan key pair ini untuk terhubung ke host bastion.

ssh-keygen -t rsa -f my_key
DevOps insinyur, Pengembang
TugasDeskripsiKeterampilan yang dibutuhkan

Dapatkan ID instance.

  1. Untuk terhubung ke host bastion yang digunakan, Anda memerlukan ID instans Amazon EC2 . Lakukan salah satu hal berikut untuk menemukan ID:

    • Buka EC2 konsol Amazon. Di panel navigasi, pilih Instans. Temukan instance host bastion.

    • Di AWS CLI, masukkan perintah berikut.

      aws ec2 describe-instances

      Untuk memfilter hasil, masukkan perintah berikut, di mana tag $BASTION_HOST_TAG yang Anda tetapkan ke host bastion. Nilai default untuk tag ini adalahsandbox-dev-bastion-host.

      aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$BASTION_HOST_TAG" \ --output text \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text
  2. Salin ID EC2 instance Amazon. Anda menggunakan ID ini nanti.

AWS Umum

Kirim kunci publik SSH.

catatan

Di bagian ini, Anda mengunggah kunci publik ke metadata instance dari host bastion. Setelah kunci diunggah, Anda memiliki 60 detik untuk memulai koneksi dengan host bastion. Setelah 60 detik, kunci publik dihapus. Untuk informasi selengkapnya, lihat bagian Pemecahan Masalah dari pola ini. Selesaikan langkah selanjutnya dengan cepat untuk mencegah kunci dihapus sebelum Anda terhubung ke host bastion.

  1. Kirim kunci SSH ke host bastion menggunakan Amazon Instance EC2 Connect. Masukkan perintah berikut, di mana:

    • $INSTANCE_IDadalah ID dari EC2 instance Amazon

    • $PUBLIC_KEY_FILEadalah jalur ke file kunci publik Anda, seperti my_key.pub

      penting

      Pastikan untuk menggunakan kunci publik dan bukan kunci pribadi.

    aws ec2-instance-connect send-ssh-public-key \ --instance-id $INSTANCE_ID \ --instance-os-user ec2-user \ --ssh-public-key file://$PUBLIC_KEY_FILE
  2. Tunggu hingga Anda menerima pesan yang menunjukkan bahwa kunci telah berhasil diunggah. Lanjutkan ke langkah berikutnya segera.

AWS Umum

Connect ke host bastion.

  1. Masukkan perintah berikut untuk terhubung ke host bastion melalui Session Manager, di mana:

    • $PRIVATE_KEY_FILEadalah jalan menuju kunci pribadi Anda, seperti my_key

    • $INSTANCE_IDadalah ID dari EC2 instance Amazon

    ssh -i $PRIVATE_KEY_FILE ec2-user@$INSTANCE_ID
  2. Konfirmasikan koneksi dengan memasukkanyes. Ini membuka koneksi SSH dengan menggunakan Session Manager.

catatan

Ada opsi lain untuk membuka koneksi SSH dengan host bastion. Untuk informasi lebih lanjut, lihat Pendekatan alternatif untuk membuat koneksi SSH dengan host bastion di bagian Informasi tambahan dari pola ini.

AWS Umum
TugasDeskripsiKeterampilan yang dibutuhkan

Hapus sumber daya yang digunakan.

  1. Untuk menghapus semua sumber daya yang digunakan, jalankan perintah berikut dari direktori root repositori kloning.

    terraform destroy -var-file="dev.tfvars"
  2. Konfirmasikan penghapusan sumber daya.

DevOps insinyur, Pengembang, Terraform

Pemecahan Masalah

IsuSolusi

TargetNotConnectedkesalahan saat mencoba terhubung ke host bastion

  1. Reboot host bastion sesuai dengan instruksi di Reboot instance Anda di EC2 dokumentasi Amazon.

  2. Setelah instance berhasil di-boot ulang, kirim ulang kunci publik ke host bastion dan coba ulang koneksi.

Permission deniedkesalahan saat mencoba terhubung ke host bastion

Setelah kunci publik diunggah ke host bastion, Anda hanya memiliki 60 detik untuk memulai koneksi. Setelah 60 detik, kunci secara otomatis dihapus, dan Anda tidak dapat menggunakannya untuk terhubung ke instance. Jika ini terjadi, Anda dapat mengulangi langkah untuk mengirim ulang kunci ke instance.

Sumber daya terkait

AWS dokumentasi

Sumber daya lainnya

Informasi tambahan

Pendekatan alternatif untuk membangun koneksi SSH dengan host bastion

Penerusan port

Anda dapat menggunakan -D 8888 opsi untuk membuka koneksi SSH dengan penerusan port dinamis. Untuk informasi lebih lanjut, lihat petunjuk di explainshell.com. Berikut ini adalah contoh perintah untuk membuka koneksi SSH dengan menggunakan port forwarding.

ssh -i $PRIVATE_KEY_FILE -D 8888 ec2-user@$INSTANCE_ID

Ini adalah jenis koneksi membuka proxy SOCKS yang dapat meneruskan lalu lintas dari browser lokal Anda melalui host bastion. Jika Anda menggunakan Linux atau macOS, untuk melihat semua opsi, masukkan. man ssh Ini menampilkan manual referensi SSH.

Menggunakan skrip yang disediakan

Alih-alih menjalankan langkah-langkah yang dijelaskan di Connect to the bastion host secara manual dengan menggunakan Session Manager di bagian Epics, Anda dapat menggunakan skrip connect.sh yang disertakan dalam repositori kode. Skrip ini menghasilkan key pair SSH, mendorong kunci publik ke EC2 instance Amazon, dan memulai koneksi dengan host bastion. Saat Anda menjalankan skrip, Anda meneruskan tag dan nama kunci sebagai argumen. Berikut ini adalah contoh dari perintah untuk menjalankan script.

./connect.sh sandbox-dev-bastion-host my_key