Kubernetes — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м
м
Строка 6: Строка 6:
  
 
Предварительно статья разделена на сервисы и как их можно найти, эксплуатировать и может быть закрепиться.
 
Предварительно статья разделена на сервисы и как их можно найти, эксплуатировать и может быть закрепиться.
 +
 +
= Общее =
 +
 +
== Запросы к API ==
 +
 +
=== Настройка утилит ===
 +
 +
==== kubectl ====
 +
 +
Для общения с API можно воспользоваться стандартным ПО kubectl.
 +
 +
Пример запроса:
 +
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl get secrets
 +
</syntaxhighlight>
 +
 +
 +
Запросы можно делать inline с токеном:
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl --token=$TOKEN --server=$APISERVER --insecure-skip-tls-verify=true
 +
</syntaxhighlight>
 +
 +
==== curl ====
 +
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
export APISERVER=${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}
 +
export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
 +
export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
 +
export TOKEN=$(cat ${SERVICEACCOUNT}/token)
 +
# Лишняя строка, но можно использовать с curl --cacert ${CACERT}
 +
# export CACERT=${SERVICEACCOUNT}/ca.crt
 +
 +
curl -k --header "Authorization: Bearer ${TOKEN}"
 +
</syntaxhighlight>
 +
 +
=== Текущая конфигурация ===
 +
 +
==== Конфиг ====
 +
 +
Общая информация
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl config view
 +
</syntaxhighlight>
 +
 +
 +
==== Пользователи ====
 +
 +
Список пользователей
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl config get-users
 +
kubectl config view -o jsonpath='{.users[*].name}'
 +
</syntaxhighlight>
 +
 +
==== Контексты ====
 +
 +
Список контекстов
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl config get-contexts
 +
</syntaxhighlight>
 +
 +
 +
Текущий контекст
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl config current-context
 +
</syntaxhighlight>
 +
 +
Установить контекст
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl config use-context my-cluster-name
 +
</syntaxhighlight>
 +
 +
==== Namespace  ====
 +
 +
Установить namespace по-умолчанию
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
kubectl config set-context --current --namespace=ggckad-s2
 +
</syntaxhighlight>
 +
 +
  
 
= Pod =
 
= Pod =
Строка 24: Строка 104:
 
/secrets/kubernetes.io/serviceaccount  
 
/secrets/kubernetes.io/serviceaccount  
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
== Переменные окружения ==
 +
 +
Команда для получения адреса API-сервера (обычно переменная KUBECONFIG):
 +
 +
<syntaxhighlight lang="bash" line="1" enclose="div" style="overflow-x:auto" >
 +
(env | set) | grep -i "kuber|kube"
 +
</syntaxhighlight>
 +
  
 
= Role-Based Access Control =
 
= Role-Based Access Control =

Версия 20:05, 12 марта 2022


Статья посвящена тестированию на проникновение Kubernetes.


Предварительно статья разделена на сервисы и как их можно найти, эксплуатировать и может быть закрепиться.

Общее

Запросы к API

Настройка утилит

kubectl

Для общения с API можно воспользоваться стандартным ПО kubectl.

Пример запроса:

1 kubectl get secrets


Запросы можно делать inline с токеном:

1 kubectl --token=$TOKEN --server=$APISERVER --insecure-skip-tls-verify=true

curl

1 export APISERVER=${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}
2 export SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
3 export NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
4 export TOKEN=$(cat ${SERVICEACCOUNT}/token)
5 # Лишняя строка, но можно использовать с curl --cacert ${CACERT}
6 # export CACERT=${SERVICEACCOUNT}/ca.crt
7 
8 curl -k --header "Authorization: Bearer ${TOKEN}"

Текущая конфигурация

Конфиг

Общая информация

1 kubectl config view


Пользователи

Список пользователей

1 kubectl config get-users
2 kubectl config view -o jsonpath='{.users[*].name}'

Контексты

Список контекстов

1 kubectl config get-contexts


Текущий контекст

1 kubectl config current-context

Установить контекст

1 kubectl config use-context my-cluster-name

Namespace

Установить namespace по-умолчанию

1 kubectl config set-context --current --namespace=ggckad-s2


Pod

Локальные файлы

ca.crt - сертификат для проверки коммуникаций (можно отключить в curl функцией -k)

namespace - текущее рабочее пространство

token - сервисный токен Pod'а

Где их обычно можно найти:

1 /run/secrets/kubernetes.io/serviceaccount
2 /var/run/secrets/kubernetes.io/serviceaccount
3 /secrets/kubernetes.io/serviceaccount

Переменные окружения

Команда для получения адреса API-сервера (обычно переменная KUBECONFIG):

1 (env | set) | grep -i "kuber|kube"


Role-Based Access Control

Система по управлению ролями. Если проще - просто система контроля доступа, которая говорит куда у нас есть доступ и что это за доступ (get, list, update, delete).


Как правило, неправильная настройка доступа может привести к проблемам безопасности.


Для получения списка доступных ресурсов у сервисного аккаунта, требуется выполнить следующую команду:

1 # Весь список привилегий
2 kubectl get rolebindings,clusterrolebindings --all-namespaces -o custom-columns='KIND:kind,NAMESPACE:metadata.namespace,NAME:metadata.name,SERVICE_ACCOUNTS:subjects[?(@.kind=="ServiceAccount")].name' | grep service_account_name
1 curl -s $APISERVER/apis/rbac.authorization.k8s.io/v1/clusterrolebindings?limit=500 --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt
2 # удачи парсить:)

Там же можно посмотреть информацию о роли.

Далее проблемы будут разделены на ресурсы, к которым был предоставлен доступ

secrets

Относится к etcd - хранилище секретов.

Доступ list

Позволяет получить список всех секретов в namespace.

kubectl

1 kubectl get secrets


HTTP API

1 curl -s $APISERVER/api/v1/secrets/ --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt

Доступ get

Позволяет прочитать секрет.

Проблема в том, что при этом не всегда у нас будет доступ list на получение списка секретов, но тк идентификатор секрета - это 5 символов из A..Z, поэтому его возможно перебрать.

Пример названия секрета пользователя drakylar-admin:

1 drakylalr-admin-token-sgjbp

где sgjbp - случайная строка.


kubectl

Получить секрет по имени

1 kubectl get secrets secret_name -o yaml

curl

1 curl -s $APISERVER/api/v1/namespaces/default/secrets/drakylar-admin-token-sgjbp --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt

pods

Доступ create

Позволяет создавать новые Pod'ы.