Kubernetes Pivoting to Clouds
GCP
Eğer bir k8s kümesini GCP içinde çalıştırıyorsanız, küme içinde çalışan bazı uygulamaların GCP'ye erişmesini isteyebilirsiniz. Bunun için iki yaygın yol vardır:
GCP-SA anahtarlarını gizli olarak bağlama
Bir kubernetes uygulamasına GCP'ye erişim vermenin yaygın bir yolu şudur:
Bir GCP Hizmet Hesabı oluşturun
İstenilen izinleri ona bağlayın
Oluşturulan SA'nın json anahtarını indirin
Pod içinde bir gizli olarak bağlayın
GOOGLE_APPLICATION_CREDENTIALS ortam değişkenini json dosyasının bulunduğu yola ayarlayın.
Bu nedenle, bir saldırgan olarak, bir pod içindeki bir konteynırı ele geçirirseniz, bu env değişkenini ve GCP kimlik bilgileriyle json dosyalarını kontrol etmelisiniz.
GSA json'ını KSA gizli ile ilişkilendirme
Bir GSA'ya bir GKE kümesinde erişim vermenin bir yolu şu şekildedir:
Aşağıdaki komutu kullanarak GKE kümenizin aynı ad alanında bir Kubernetes hizmet hesabı oluşturun:
GKE kümesine erişim sağlamak istediğiniz GCP hizmet hesabının kimlik bilgilerini içeren bir Kubernetes Secret oluşturun. Bunu aşağıdaki örnekte gösterildiği gibi
gcloud
komut satırı aracını kullanarak yapabilirsiniz:
Aşağıdaki komutu kullanarak Kubernetes Gizemini Kubernetes hizmet hesabına bağlayın:
İkinci adımda, GSA'nın kimlik bilgileri KSA'nın sırrı olarak ayarlandı. Ardından, GKE kümesinin içinden bu sırrı okuyabiliyorsanız, o GCP hizmet hesabına yükseltme yapabilirsiniz.
GKE İş Yükü Kimliği
İş Yükü Kimliği ile, bir Kubernetes hizmet hesabını bir Google hizmet hesabı olarak kullanmasını yapılandırabiliriz. Kubernetes hizmet hesabıyla çalışan pod'lar, Google Cloud API'lerine erişirken otomatik olarak Google hizmet hesabı olarak kimlik doğrulaması yapar.
Bu davranışı etkinleştirmek için ilk adım serisi, GCP'de İş Yükü Kimliği'ni etkinleştirmek (adımlar) ve k8s'in taklit etmesini istediğiniz GCP SA'yı oluşturmaktır.
Yeni bir kümede İş Yükü Kimliğini etkinleştirin
Bir pod çalıştırın ve KSA ile GSA'ya erişimi kontrol edin:
Aşağıdaki komutu kimlik doğrulama gerektiğinde kullanmak için kontrol edin:
K8s içinde bir saldırgan olarak, iam.gke.io/gcp-service-account
açıklamasına sahip SA'ları aramalısınız, çünkü bu, SA'nın GCP'de bir şeye erişebileceğini gösterir. Başka bir seçenek, kümedeki her KSA'yı kötüye kullanmaya çalışmak ve erişimi kontrol etmektir.
GCP'den, SA'lara Kubernetes içinde hangi erişimi verdiğinizi belirlemek için bağlantıları numaralandırmak her zaman ilginçtir.
Bu, tüm pod tanımlarını kolayca gezmek için bir betiktir:
AWS
Kiam & Kube2IAM (Podlar için IAM rolü)
Podlara IAM Rollerini vermenin (eski bir) yolu, bir Kiam veya Kube2IAM sunucusu kullanmaktır. Temel olarak, bir daemonset'i, bir tür ayrıcalıklı IAM rolü ile kümenizde çalıştırmanız gerekecektir. Bu daemonset, ihtiyaç duyan podlara IAM rollerine erişim sağlayacak olan daemonset olacaktır.
İlk olarak, hangi rollerin ad alanı içinde erişilebilir olacağını yapılandırmanız gerekmektedir ve bunu ad alanı nesnesi içinde bir açıklama ile yaparsınız:
Namespace, IAM rolleriyle yapılandırıldığında, Pod'lar üzerinde sahip olabileceğiniz rolleri belirtebilirsiniz. Her pod tanımında aşağıdaki gibi bir rol belirtebilirsiniz:
Bir saldırgan olarak, eğer podlarda veya namespace'lerde veya bir kiam/kube2iam sunucusunda (muhtemelen kube-system içinde) bu açıklamaları bulursanız, zaten podlar tarafından kullanılan her rolü taklit edebilirsiniz ve daha fazlasını (AWS hesabına erişiminiz varsa rolleri sıralayın).
IAM Rolü ile Pod Oluşturma
Belirtilen IAM rolü, kiam/kube2iam rolüyle aynı AWS hesabında olmalı ve bu rolün erişimine izin verilmelidir.
K8s Hizmet Hesapları için IAM Rolü OIDC ile
Bu, AWS tarafından önerilen yöntemdir.
İlk olarak, küme için bir OIDC sağlayıcı oluşturmanız gerekmektedir.
Ardından, SA'nın gereksinim duyacağı izinlere sahip bir IAM rolü oluşturun.
IAM rolü ile SA arasında bir güven ilişkisi oluşturun (veya rolün tüm SA'ların erişimine izin veren ad alanlarına güven verin). Güven ilişkisi, temel olarak OIDC sağlayıcı adını, ad alanı adını ve SA adını kontrol edecektir.
Son olarak, bir SA oluşturun ve bir rolün ARN'sini belirten bir açıklama ekleyin, ve bu SA ile çalışan pod'lar, rolün belirtecine erişim sağlayacaktır. Belirteç, bir dosyaya yazılır ve yol,
AWS_WEB_IDENTITY_TOKEN_FILE
içinde belirtilir (varsayılan:/var/run/secrets/eks.amazonaws.com/serviceaccount/token
).
/var/run/secrets/eks.amazonaws.com/serviceaccount/token
dosyasından AWS'yi token kullanarak almak için şunu çalıştırın:
Bir saldırgan olarak, bir K8s kümesini numaralandırabiliyorsanız, bu işaretlemeyle hizmet hesaplarını kontrol edin ve AWS'ye yükseltin. Bunun için, sadece IAM ayrıcalıklı hizmet hesaplarından birini kullanarak bir pod oluşturun ve token'ı çalın.
Ayrıca, bir pod içindeyseniz, AWS_ROLE_ARN ve AWS_WEB_IDENTITY_TOKEN gibi çevre değişkenlerini kontrol edin.
Bazen bir rolün Güven Politikası yanlış yapılandırılmış olabilir ve beklenen hizmet hesabına AssumeRole erişimi yerine, tüm hizmet hesaplarına erişim sağlar. Bu nedenle, kontrol edilen bir hizmet hesabına bir işaretleme yazabilme yeteneğine sahipseniz, role erişebilirsiniz.
Daha fazla bilgi için aşağıdaki sayfayı kontrol edin:
Kümedeki IAM Rolleriyle Pod'ları ve Hizmet Hesaplarını Bulma
Bu, tüm pod'ları ve hizmet hesaplarını tanımlarını gezen ve bu işaretlemeyi arayan bir betiktir:
Node IAM Rolü
Önceki bölüm, podlarla IAM Rollerini nasıl çalacağınız hakkındaydı, ancak K8s kümesinin bir Düğümü, bir bulutta içeride bir örnek olacak. Bu, Düğümün büyük olasılıkla çalabileceğiniz yeni bir IAM rolüne sahip olacağı anlamına gelir (genellikle bir K8s kümesinin tüm düğümlerinin aynı IAM rolüne sahip olacağını unutmayın, bu yüzden her düğümü kontrol etmeye değmeyebilir).
Ancak, düğümden meta veri uç noktasına erişmek için önemli bir gereklilik vardır, düğümde olmanız (ssh oturumu?) veya en azından aynı ağa sahip olmanız gerekmektedir:
IAM Rolü Token'ını Çalma
Daha önce, Pod'lara IAM Rollerini eklemeyi veya hatta IAM Rolünü çalmak için Node'a kaçmayı nasıl tartıştığımızı görmüştük.
Yeni kazandığınız IAM rolü kimlik bilgilerini çalmak için aşağıdaki betiği kullanabilirsiniz:
Referanslar
Last updated