Translated ['src/pentesting-cloud/kubernetes-security/kubernetes-pivotin

This commit is contained in:
Translator
2025-01-02 21:34:29 +00:00
parent 106295c603
commit fecb23c9ba
7 changed files with 181 additions and 51 deletions

View File

@@ -4,7 +4,7 @@
## GCP
Eğer GCP içinde bir k8s kümesi çalıştırıyorsanız, muhtemelen küme içinde çalışan bazı uygulamaların GCP'ye erişimi olmasını istersiniz. Bunu yapmanın 2 yaygın yolu vardır:
Eğer GCP içinde bir k8s kümesi çalıştırıyorsanız, muhtemelen küme içinde çalışan bazı uygulamaların GCP'ye erişimi olmasını isteyeceksiniz. Bunu yapmanın 2 yaygın yolu vardır:
### GCP-SA anahtarlarını gizli olarak bağlama
@@ -118,7 +118,7 @@ kubectl exec -it workload-identity-test \
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/email
gcloud auth list
```
Aşağıdaki komutu, gerekirse kimlik doğrulamak için kontrol edin:
Gerekirse kimlik doğrulamak için aşağıdaki komutu kontrol edin:
```bash
gcloud auth activate-service-account --key-file=/var/run/secrets/google/service-account/key.json
```
@@ -161,7 +161,7 @@ iam.amazonaws.com/allowed-roles: |
["role-arn"]
name: default
```
Bir namespace IAM rolleri ile yapılandırıldığında, Pod'ların sahip olabileceği **her pod tanımında istediğiniz rolü şu şekilde belirtebilirsiniz**:
Bir kez IAM rolleri ile yapılandırıldığında, Pod'ların her bir pod tanımında **şu şekilde istediğiniz rolü belirtebilirsiniz**:
```yaml:Kiam & Kube2iam
kind: Pod
metadata:
@@ -171,12 +171,12 @@ annotations:
iam.amazonaws.com/role: reportingdb-reader
```
> [!WARNING]
> Bir saldırgan olarak, eğer pod'larda veya ad alanlarında veya çalışan bir kiam/kube2iam sunucusunda (muhtemelen kube-system'de) **bu anotasyonları bulursanız**, **pod'lar tarafından zaten kullanılan** her r**olü taklit edebilirsiniz** ve daha fazlasını (AWS hesabınıza erişiminiz varsa rolleri listeleyin).
> Bir saldırgan olarak, eğer pod'larda veya ad alanlarında veya çalışan bir kiam/kube2iam sunucusunda (muhtemelen kube-system'de) **bu notları bulursanız**, **pod'lar tarafından zaten kullanılan** her r**olü taklit edebilirsiniz** ve daha fazlası (AWS hesabınıza erişiminiz varsa rolleri listeleyin).
#### IAM Rolü ile Pod Oluştur
> [!NOTE]
> Belirtilmesi gereken IAM rolü, kiam/kube2iam rolüyle aynı AWS hesabında olmalı ve o rol buna erişim sağlayabilmelidir.
> Belirtilen IAM rolü, kiam/kube2iam rolüyle aynı AWS hesabında olmalı ve o rol buna erişim sağlayabilmelidir.
```yaml
echo 'apiVersion: v1
kind: Pod
@@ -198,8 +198,8 @@ Bu, **AWS tarafından önerilen yoldur**.
1. Öncelikle [küme için bir OIDC sağlayıcısı oluşturmanız gerekir](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html).
2. Ardından, SA'nın ihtiyaç duyacağı izinlerle bir IAM rolü oluşturun.
3. IAM rolü ile SA arasında [bir güven ilişkisi oluşturun](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html) adı (veya rolü tüm namespace'lerin SA'larına erişim sağlayacak şekilde veren namespace'ler). _Güven ilişkisi esasen OIDC sağlayıcı adı, namespace adı ve SA adını kontrol edecektir_.
4. Son olarak, **rolün ARN'sini belirten bir anotasyon ile bir SA oluşturun** ve o SA ile çalışan podlar **rolün token'ına erişime sahip olacaktır**. **Token**, **bir dosyanın içine yazılır** ve yol **`AWS_WEB_IDENTITY_TOKEN_FILE`** içinde belirtilir (varsayılan: `/var/run/secrets/eks.amazonaws.com/serviceaccount/token`)
3. IAM rolü ile SA arasında [bir güven ilişkisi oluşturun](https://docs.aws.amazon.com/eks/latest/userguide/associate-service-account-role.html) adı (veya rolü tüm namespace'lerin SAs'ına erişim sağlayacak namespace'ler). _Güven ilişkisi esasen OIDC sağlayıcı adı, namespace adı ve SA adını kontrol edecektir_.
4. Son olarak, **rolün ARN'sini belirten bir anotasyon ile bir SA oluşturun** ve o SA ile çalışan podlar **rolün token'ına erişime sahip olacaktır**. **Token**, **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`)
```bash
# Create a service account with a role
cat >my-service-account.yaml <<EOF
@@ -221,7 +221,7 @@ AWS'yi **token ile almak için** `/var/run/secrets/eks.amazonaws.com/serviceacco
aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/EKSOIDCTesting --role-session-name something --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token
```
> [!WARNING]
> Bir saldırgan olarak, eğer bir K8s kümesini sayabiliyorsanız, **AWS'ye yükseltmek için o anotasyona sahip hizmet hesaplarını** kontrol edin. Bunu yapmak için, sadece bir IAM **yetkili hizmet hesabı** kullanarak bir **pod** **exec/create** edin ve token'ı çalın.
> Bir saldırgan olarak, eğer bir K8s kümesini sayabiliyorsanız, **AWS'ye yükseltmek için o anotasyona sahip hizmet hesaplarını** kontrol edin. Bunu yapmak için, sadece bir IAM **yetkili hizmet hesabı** kullanarak bir **pod** **exec/create** edin ve token'ı ç steal.
>
> Ayrıca, bir pod'un içindeyseniz, **AWS_ROLE_ARN** ve **AWS_WEB_IDENTITY_TOKEN** gibi ortam değişkenlerini kontrol edin.
@@ -236,7 +236,7 @@ aws sts assume-role-with-web-identity --role-arn arn:aws:iam::123456789098:role/
### Kümedeki IAM Rolleri ile SAs Bulun
Bu, o **anotasyonu** aramak için **tüm pod'lar ve sas** tanımlarını kolayca **döngüye sokan** bir betiktir:
Bu, o **anotasyonu** aramak için **tüm podlar ve sas** tanımlarını kolayca **döngüye sokan** bir betiktir:
```bash
for ns in `kubectl get namespaces -o custom-columns=NAME:.metadata.name | grep -v NAME`; do
for pod in `kubectl get pods -n "$ns" -o custom-columns=NAME:.metadata.name | grep -v NAME`; do
@@ -255,9 +255,9 @@ done | grep -B 1 "amazonaws.com"
```
### Node IAM Role
Önceki bölüm, IAM Rolleri'ni pod'larla nasıl çalacağınız hakkında idi, ancak **K8s kümesinin bir Node'u**'nun **bulut içinde bir örnek** olacağını unutmayın. Bu, Node'un **çalmaya değer yeni bir IAM rolüne sahip olma olasılığının yüksek olduğu** anlamına gelir (_genellikle bir K8s kümesinin tüm node'ları aynı IAM rolüne sahip olacağından, her node'u kontrol etmeye çalışmak çok da mantıklı olmayabilir_).
Önceki bölüm, IAM Rolleri'ni pod'larla nasıl çalacağınız hakkında idi, ancak K8s kümesinin bir **Node'unun bulut içinde bir **instance** olacağını unutmayın. Bu, Node'un **çalmaya değer yeni bir IAM rolüne sahip olma olasılığının yüksek olduğu** anlamına gelir (_genellikle bir K8s kümesinin tüm node'ları aynı IAM rolüne sahip olacağından, her node'u kontrol etmeye çalışmak çok da mantıklı olmayabilir_).
Ancak, node'dan metadata uç noktasına erişmek için önemli bir gereklilik vardır, node'da olmanız (ssh oturumu?) veya en azından aynı ağda olmanız gerekir:
Ancak, node'dan metadata endpoint'ine erişmek için önemli bir gereklilik vardır, node'da olmanız (ssh oturumu?) veya en azından aynı ağda olmanız gerekir:
```bash
kubectl run NodeIAMStealer --restart=Never -ti --rm --image lol --overrides '{"spec":{"hostNetwork": true, "containers":[{"name":"1","image":"alpine","stdin": true,"tty":true,"imagePullPolicy":"IfNotPresent"}]}}'
```
@@ -265,7 +265,7 @@ kubectl run NodeIAMStealer --restart=Never -ti --rm --image lol --overrides '{"s
Daha önce **IAM Rolleri Pod'lara nasıl eklenir** veya **örneğin bağlı olduğu IAM Rolünü çalmak için Node'a nasıl kaçılır** konularını tartıştık.
Aşağıdaki scripti kullanarak **çalışarak elde ettiğiniz yeni** IAM rolü **kimlik bilgilerini çalabilirsiniz**:
Aşağıdaki scripti kullanarak **çalışarak elde ettiğiniz yeni IAM rolü kimlik bilgilerinizi çalabilirsiniz**:
```bash
IAM_ROLE_NAME=$(curl http://169.254.169.254/latest/meta-data/iam/security-credentials/ 2>/dev/null || wget http://169.254.169.254/latest/meta-data/iam/security-credentials/ -O - 2>/dev/null)
if [ "$IAM_ROLE_NAME" ]; then