Kubernetes — различия между версиями
Drakylar (обсуждение | вклад) м |
Drakylar (обсуждение | вклад) м |
||
Строка 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.
Пример запроса:
kubectl get secrets
Запросы можно делать inline с токеном:
kubectl --token=$TOKEN --server=$APISERVER --insecure-skip-tls-verify=true
curl
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}"
Текущая конфигурация
Конфиг
Общая информация
kubectl config view
Пользователи
Список пользователей
kubectl config get-users
kubectl config view -o jsonpath='{.users[*].name}'
Контексты
Список контекстов
kubectl config get-contexts
Текущий контекст
kubectl config current-context
Установить контекст
kubectl config use-context my-cluster-name
Namespace
Установить namespace по-умолчанию
kubectl config set-context --current --namespace=ggckad-s2
Pod
Локальные файлы
ca.crt - сертификат для проверки коммуникаций (можно отключить в curl функцией -k)
namespace - текущее рабочее пространство
token - сервисный токен Pod'а
Где их обычно можно найти:
/run/secrets/kubernetes.io/serviceaccount
/var/run/secrets/kubernetes.io/serviceaccount
/secrets/kubernetes.io/serviceaccount
Переменные окружения
Команда для получения адреса API-сервера (обычно переменная KUBECONFIG):
(env | set) | grep -i "kuber|kube"
Role-Based Access Control
Система по управлению ролями. Если проще - просто система контроля доступа, которая говорит куда у нас есть доступ и что это за доступ (get, list, update, delete).
Как правило, неправильная настройка доступа может привести к проблемам безопасности.
Для получения списка доступных ресурсов у сервисного аккаунта, требуется выполнить следующую команду:
# Весь список привилегий
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
curl -s $APISERVER/apis/rbac.authorization.k8s.io/v1/clusterrolebindings?limit=500 --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt
# удачи парсить:)
Там же можно посмотреть информацию о роли.
Далее проблемы будут разделены на ресурсы, к которым был предоставлен доступ
secrets
Относится к etcd - хранилище секретов.
Доступ list
Позволяет получить список всех секретов в namespace.
kubectl
kubectl get secrets
HTTP API
curl -s $APISERVER/api/v1/secrets/ --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt
Доступ get
Позволяет прочитать секрет.
Проблема в том, что при этом не всегда у нас будет доступ list на получение списка секретов, но тк идентификатор секрета - это 5 символов из A..Z, поэтому его возможно перебрать.
Пример названия секрета пользователя drakylar-admin:
drakylalr-admin-token-sgjbp
где sgjbp - случайная строка.
kubectl
Получить секрет по имени
kubectl get secrets secret_name -o yaml
curl
curl -s $APISERVER/api/v1/namespaces/default/secrets/drakylar-admin-token-sgjbp --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt
pods
Доступ create
Позволяет создавать новые Pod'ы.