2009-03-12 17 views
20

EC2 örneklerini S3 ve SQS sorgulaması gerektiren AWS'ye dayalı bir iş işleme mimarisine sahibim. Örneklerin API'ye erişebilmesi için kimlik bilgileri, base64 kodlu bir kabuk komut dosyası biçiminde kullanıcı verileri (-f) olarak gönderilir. Örneğin: Her bir örnek çözümler ve bir 'gizli-şifre' kullanarak ec2.zip çözerAWS kimlik bilgilerini bir EC2 örneğine kullanıcı verileri olarak geçirmenin en iyi yöntemi nedir?

$ cat ec2.sh 
... 
export AWS_ACCOUNT_NUMBER='1111-1111-1111' 
export AWS_ACCESS_KEY_ID='0x0x0x0x0x0x0x0x0x0' 
... 
$ zip -P 'secret-password' ec2.sh 
$ openssl enc -base64 -in ec2.zip 

Birçok örneği başlatılan ...

$ ec2run ami-a83fabc0 -n 20 -f ec2.zip 

Bir init komut dosyası içine kodlanmış. Çalışmamıza rağmen, yaklaşımımla ilgili iki meselem var.

  1. 'zip -P' çok güvenli değil
  2. şifre örneğinde sert kodlanmıştır

yöntem birine çok benzer (her zaman 'gizli-şifre' var) tarif edilmiş daha şık veya kabul edilmiş bir yaklaşım var mıdır? Kimlik bilgilerini şifrelemek ve özel anahtarın şifresini çözmek için gpg'yi saklamak için gpg kullanmak şu an düşünmekte olduğum bir yaklaşımdır ama herhangi bir uyarıdan habersizim. AWS anahtar çiftlerini doğrudan kullanabilir miyim? API'nın bazı açık kısımlarını kaçırıyor muyum?

cevap

12

Sen makinede kimlik bilgilerini saklayabilirsiniz (veya transfer, kullanılması, daha sonra bunları kaldırmak.)

Sen (örn etkileşimli olmayan kimlik doğrulama örneğin anahtar çifti ile scp kullanarak) güvenli bir kanal üzerinden kimlik bilgilerini aktarmak, böylece Eğer herhangi bir özel şifreleme gerçekleştirmek için ihtiyaç olmaz (sadece izinleri düzgün usta dosyaların izinlerini örneğin her zaman anahtar dosya üzerinde 0400 olarak ayarlanmış ayarlanmış olduğundan emin olun ve scp -p kullanın) yukarıdaki değilse

sorunuza cevap verin, lütfen daha ayrıntılı bilgi veriniz. kurulumunuz nedir ve ne elde etmeye çalışıyorsunuz. EC2 eylemleri merkezi bir konumdan birden çok düğümde başlatılacak mı? SSH, çoklu düğümler ve merkezi konum arasında kullanılabilir mi? Vb


Eğer AMI öncelikle AWS tuşlarıyla kullanıcı verilerini (ec2-run-instances -f user-data-file) doldurmak için örneğini olanlar gerektiren parameterizing your AMI düşündünüz mü DÜZENLEME? AMI'niz daha sonra bu örnek başına parametreleri http://169.254.169.254/1.0/user-data'dan dinamik olarak alabilir.Verilerin

  1. Güvenlik AMI user-data şifresiz saklanan :


    GÜNCELLEME

    Tamam, burada şimdiye kadar tartışılan çeşitli yaklaşımların bir güvenlik fikirli karşılaştırma gider

    • düşük
    • düz metin veri , curl, wget vb AMI oturum yönetir ve telnet erişimi olan herhangi kullanıcı tarafından erişilebilen sen savunmasız
    • (düz metin http://169.254.169.254/1.0/user-data erişebilir) vekalet talep saldırılarına saldırgan ya da alma ve kolayca elde edilebilen anahtar ile düz metin http://169.254.169.254/1.0/user-data) AMI user-data depolanır ve şifreli (ya da bir şekilde şifresi çözülebilen veri
  2. Güvenlik) iletmek için AMI üzerinde çalışan olabilir ya da olmayabilir Apache sorar
    • düşük
    • kolayca elde edilebilen anahtar (şifre) içerebilir:
      • anahtar Bir ABI içinde (ABI'nın bir saldırgan tarafından alınabileceği) bir komut dosyasında kodlanmış olarak kodlanmış olan AMI'nin kendisinde bir komut dosyasında sabit kodlanmış kodoturum açmayı yöneten herhangi bir kullanıcı tarafından okunabilir kamusal anahtarları gibi AMI
      • başka kolay elde bilgileri vb
      • herhangi bir özel anahtar, kolayca bulunabilen anahtarı (parola) verilen
    • aynı (kamu anahtarı kolayca elde edilebilir) 1. noktada tanımlanan problemler geçerlidir:
      • deşifre verileri (proxy isteği saldırılarına karşı savunmasız
      • (düz metin http://169.254.169.254/1.0/user-data erişebilirler) , curl, wget vb AMI oturum yönetir ve telnet erişimi olan herhangi kullanıcı için erişilebilir ÖrneğinSaldırgan AMI user-data depolandıklarında veya) ulteriorly kolayca elde edilebilen anahtar ile descrypted veri
  3. Güvenlik almak ve şifrelenmiş http://169.254.169.254/1.0/user-data iletmek için AMI üzerinde çalışan olabilir ya da olmayabilir Apache sorar ve kolay bir anahtar elde
    • ortalama
    • şifrelenmiş bir veri ile şifrelenmiş herhangi 012.389.083 için erişilebilir vb AMI oturum yönetir ve telnet erişebilirkullanıcı curl, wget, daha sonra kaba saldırılar ile yapılabilir şifrelenmiş verilerin şifresinin açılması için
      • bir girişim (şifrelenmiş http://169.254.169.254/1.0/user-data erişebilir)
      • (o şifrelenecek için bir katma değer) güvenli bir konumda olarak, AMI saklanan veri
  4. Güvenlik
    • yüksek
    • veriler bir kullanıcı için erişilebilir sırayla veri gerektirmediğinden çalıştırmak için
      • ör kullanıcı tarafından sahip olunan dosyası: Maskenin 0600 veya 0400 ile kullanıcı
    • saldırganın verilere erişmek için belirli bir kullanıcının kimliğine bürünmek gerekir
        tür kullanıcı doğrudan günlüğünü reddedilmesi olarak
      • ek güvenlik katmanları, -on (etkileşimli Taklit için root geçmek zorunda) güvenlik A içeren

Böylece herhangi bir yöntem geliştirir MI user-data en güvenli yol değildir, çünkü makinedeki numaralı herhangi bir kullanıcısına erişim (zayıf nokta), verileri tehlikeye atmaktadır.

Bu

S3 kimlik bilgileri yalnızca (dağıtım işlemi yalnızca sırasında yani) zaman sınırlı bir süre için gerekli olsaydı AWS üzerine yazmak ya da onunla yapıldığında user-data içeriğini çıkarmak için izin verilmesi durumunda , hafifletilebilir (ama olabilir Bu durum böyle görünmemektedir.) Bir seçenek, dağıtım sürecinin tamamlanabilmesi ve kimlik bilgilerinin geçersiz hale getirilmesinden sonra, mümkünse (bu kimlik bilgilerinden ödün vermeden, user-data) geçici S3 kimlik bilgilerinin oluşturulması olacaktır. AWS ile, artık bir güvenlik tehdidi oluşturmaz.)

Yukarıdakiler geçerli değilse (örn. dağıtılan düğümler tarafından süresiz olarak gereken S3 kimlik bilgileri) mümkün değil (ör. yalnızca dağıtım için geçici S3 kimlik bilgileri yayınlayamaz), en iyi yöntem, mermiyi ve scp öğesinin kimlik bilgilerini, muhtemelen doğru olarak, sahiplik ve izinlerle birlikte, çeşitli düğümlere yönlendirir.

+0

AMI kullanıcılarının kendi AWS kimlik bilgilerini kullanmasını istediğimden, örnekte kimlik bilgilerini paketlemek istemiyorum. Bir örnek önyüklendiğinde, örnekleri başlatan kullanıcı tarafından belirtilen S3 gruplarına ve SQS sıralarına bağlanır. SCP birkaç makine için çalışıyor ancak 10 veya 100 değil. Döngüler için mi? meh – AdamK

+0

Tamam, bu nedenle, her kullanıcının kendi (kendi?) S3 alanınıza bağlanmak için kendi AWS kimlik bilgilerini sağlaması gereken, keyfi sayıda kullanıcıya bir AMI sağlıyorsunuz? – vladr

+0

Vlad, 'AMI'nizi parametrelendirme' makalesi şu anda şu anda şu anda bir şeyler yapıyorum. Aslında, http://blogs.oracle.com/ec2/entry/using_parameterized_launches_to_customize daha da yakındır. Sorun, benim durumumdaki kullanıcı verileri hassastır (AWS kredileri) ve şifre AMI'de yer almalıdır. – AdamK

10

iyi yolu instance profiles kullanmaktır. Temel fikir:

  • örneğin, daha önce oluşturulan rolüne bir ilke atama oluşturma, yeni bir IAM rol
  • bir örnek profili

  • oluşturun:

    { "Bildirimi": [ { "Sid": "Stmt1369049349504", "Eylem": "OKS: ", "Etkisi": "Kaynak" "Allow": "" } ]

  • Rol ve örnek profilini birlikte ilişkilendirin.

  • Yeni bir EC2 örneğini başlattığınızda, örnek profil adını sağladığınızdan emin olun. Tüm iyi çalışıyor ve kütüphane size örnek meta verilerden kimlik bilgilerini almak destekler sizin EC2 örneği içinden AWS hizmetlerine bağlanmak için kullanıyorsanız

, kodunuz AWS hizmetlerini kullanmak mümkün olacak.

boto kullanıcılı posta listesinden alınan tam bir örnek:

İlk olarak, hizmetler ve kaynaklar IAM rol erişimi olmalıdır neyi temsil eden bir JSON politika belgesini oluşturmak zorunda. Örneğin, bu politika "my_bucket" paketinin tüm S3 eylemlerini verir. Uygulamanız için uygun olan herhangi bir politikayı kullanabilirsiniz.

BUCKET_POLICY = """{ 
    "Statement":[{ 
    "Effect":"Allow", 
    "Action":["s3:*"], 
    "Resource":["arn:aws:s3:::my_bucket"]}]}""" 

Sonraki, IAM'de bir Örnek Profili oluşturmanız gerekir. Eğer örnek profiline sahip olduktan sonra

import boto 
c = boto.connect_iam() 
instance_profile = c.create_instance_profile('myinstanceprofile') 

, sen rolü oluşturmak örnek profiline rol eklemek ve rolle politikası ile ilişkilendirmek gerekir. Ben artık senin EC2 örneğine herhangi bir kimlik bilgisi tedarik gerekli olmadığını işaret etmek istiyorum

ec2 = boto.connect_ec2() 
ec2.run_instances('ami-xxxxxxx', ..., instance_profile_name='myinstanceprofile') 
+0

AWS'ye kolay API erişimi sağlamak için oluşturulmuş bir python modülü oluşturmuyor mu? Bunu bir dilde bağımsız bir şekilde, yani bir bulut şablonunda nasıl yaparsınız? – Sammaye

7

: Eğer bir örneğini başlattığınızda

role = c.create_role('myrole') 
c.add_role_to_instance_profile('myinstanceprofile', 'myrole') 
c.put_role_policy('myrole', 'mypolicy', BUCKET_POLICY) 

Şimdi şu örneği profili kullanabilirsiniz. IAM'yi kullanarak, EC2 örnekleriniz için bir rol oluşturabilirsiniz. Bu rollerde, EC2 örneğinizin örneğin belirli bir S3 paketinden belirli bir nesneyi almasına ve daha fazlasını yapmasına izin veren ince taneli ilkeler ayarlayabilirsiniz. Sen AWS dokümanlarında IAM Rolleri hakkında daha fazla bilgi edinebilirsiniz: Diğerleri zaten burada belirttiğimiz gibi

http://docs.aws.amazon.com/IAM/latest/UserGuide/WorkingWithRoles.html

+0

IAM rol yetkisi, AMI'ye giriş yapmayı yöneten herhangi bir kullanıcı tarafından kullanılabilir. Kök olmayan her hizmeti güvenli bir şekilde paketlemeniz ve ağ erişimini kısıtlamanız gerekir. – malthe

+0

Elbette, ancak bu IAM yetkilendirmesine özgü değil. Aynı şey API kimlik bilgileri için de geçerlidir. IAM kullanıcısı neye ihtiyaç duyduğunuzu * yalnızca * beyaz listeye eklediğiniz bir sistem kullanmalısınız: Daha sonra değişiklik yapabilirsiniz. –

1

, gerçekten IAM Rolleri kullanarak, bir EC2 örneği için AWS kimlik bilgilerini depolamak için gerek yoktur - https://aws.amazon.com/blogs/security/a-safer-way-to-distribute-aws-credentials-to-ec2/. Ayrıca, güvenli tutmak istediğiniz bazı db kimlik bilgileriniz varsa, EC2 örneğiniz için NON-AWS kimlik bilgilerini güvenli bir şekilde saklamak için de aynı yöntemi kullanabileceğinizi ekleyeceğim. Bir S3 Bukcet'te, non -ws kimlik bilgilerini kaydeder ve bu pakete erişmek için IAM rolünü kullanırsınız. Burada daha ayrıntılı bilgi bulabilirsiniz - https://aws.amazon.com/blogs/security/a-safer-way-to-distribute-aws-credentials-to-ec2/

İlgili konular