Admin Future
241 subscribers
51 photos
1 video
4 files
120 links
Превращаем эникейщиков в System Architects.
🚀 Твой навигатор в мире IT-инфраструктуры:

▪️ Hard Skills: Linux, Windows, Network, Security
▪️ Tools: Лучший софт и скрытые фишки
▪️ Mindset: Как думать, чтобы платили много


Админ - @maksimshap
Download Telegram
Kubernetes (Security): Аудит «привилегированных» Pod’ов и опасных контекстов

Боль: Кластер «зелёный», но в проде внезапно есть Pod’ы с privileged, hostNetwork и контейнеры, которые по факту бегут от root.
Реакция админа: «Они же работают».
Реакция архитектора: «Любая эскалация — это вопрос времени. Я хочу сигнал в моменте.»

Скрипт (Bash + kubectl + jq), выводит только рискованные контейнеры:

#!/usr/bin/env bash
# --- Kubernetes Risky Pods Audit ---
set -euo pipefail

command -v kubectl >/dev/null || { echo "[!!!] Требуется kubectl"; exit 2; }
command -v jq >/dev/null || { echo "[!!!] Требуется jq"; exit 2; }

echo "--- Начинаю аудит Pod'ов с опасными настройками ---"

data=$(kubectl get pods -A -o json)
echo "$data" | jq -r '
[.items[] as $p
| ($p.spec.containers + ($p.spec.initContainers // []))[]? as $c
| {
ns: $p.metadata.namespace,
pod: $p.metadata.name,
cont: $c.name,
img: $c.image,
privileged: ($c.securityContext.privileged // false),
hostNetwork: ($p.spec.hostNetwork // false),
hostPID: ($p.spec.hostPID // false),
runAsRoot:
((( $c.securityContext.runAsUser
// $p.spec.securityContext.runAsUser // null) == 0)
or ( ($c.securityContext.runAsNonRoot
// $p.spec.securityContext.runAsNonRoot // false) == false)),
capAdd: ($c.securityContext.capabilities.add // [])
}
]
| map(select(.privileged or .hostNetwork or .hostPID or .runAsRoot
or (.capAdd | index("SYS_ADMIN") or index("NET_ADMIN"))))
| if length==0
then "OK\tБезопасные настройки: нарушений не найдено"
else
(["NAMESPACE","POD","CONT","REASON","IMAGE"],
(.[] | [
.ns, .pod, .cont,
([
(if .privileged then "privileged" else empty end),
(if .hostNetwork then "hostNetwork" else empty end),
(if .hostPID then "hostPID" else empty end),
(if .runAsRoot then "runAsRoot" else empty end),
(if (.capAdd|index("SYS_ADMIN")) then "SYS_ADMIN" else empty end),
(if (.capAdd|index("NET_ADMIN")) then "NET_ADMIN" else empty end)
] | join(",")),
.img
]))
| @tsv
end
' | column -t

echo "--- Аудит завершен ---"
echo "Рекомендация: навесьте PSP/PSa, OPA/Gatekeeper/Kyverno и зафиксируйте политику по умолчанию (runAsNonRoot=true, drop ALL)."

Взгляд архитектора: Вы не охотитесь на последствия, вы контролируете «плоскость допуска» (admission). Скрипт — датчик, политика — предохранитель.

#kubernetes #security #sre #devops #bash #jq #скрипты
AWS (IAM Audit): Пользователи без MFA и «древние» access-keys

Боль: В компании сотни IAM-юзеров. Кто-то без MFA, у кого-то ключи живут годами.
Реакция админа: «Сделаем раз в квартал ручную проверку».
Реакция архитектора: «Автоматизировать и зафиксировать SLO по возрасту ключей.»

Скрипт (Bash + awscli + jq). Показывает: пользователей без MFA; access-keys старше N дней; прямой AdministratorAccess.

#!/usr/bin/env bash
# --- AWS IAM Hygiene Audit ---
set -euo pipefail

DAYS=${1:-90}
command -v aws >/dev/null || { echo "[!!!] Требуется AWS CLI"; exit 2; }
command -v jq >/dev/null || { echo "[!!!] Требуется jq"; exit 2; }

echo "--- Начинаю аудит IAM ---"

users=$(aws iam list-users --output json | jq -r '.Users[].UserName')

echo "[1/3] Пользователи без MFA:"
any_mfa_issues=0
while read -r u; do
[ -z "$u" ] && continue
mfa_count=$(aws iam list-mfa-devices --user-name "$u" --output json | jq '.MFADevices | length')
if [ "$mfa_count" -eq 0 ]; then
echo " - $u"
any_mfa_issues=1
fi
done <<< "$users"
[ $any_mfa_issues -eq 0 ] && echo " [OK] Все пользователи с MFA."

echo "[2/3] Access-keys старше $DAYS дн.:"
now_epoch=$(date -u +%s)
any_old_keys=0
while read -r u; do
[ -z "$u" ] && continue
aws iam list-access-keys --user-name "$u" --output json \
| jq -r '.AccessKeyMetadata[] | "\(.AccessKeyId) \(.CreateDate)"' \
| while read -r key created; do
[ -z "$key" ] && continue
created_epoch=$(date -d "$created" +%s)
age=$(( (now_epoch - created_epoch) / 86400 ))
if [ "$age" -gt "$DAYS" ]; then
echo " - $u $key ${age}d"
any_old_keys=1
fi
done
done <<< "$users"
[ $any_old_keys -eq 0 ] && echo " [OK] Старых ключей нет."

echo "[3/3] Прямой AdministratorAccess на юзере:"
any_admin=0
while read -r u; do
[ -z "$u" ] && continue
pol=$(aws iam list-attached-user-policies --user-name "$u" --output json \
| jq -r '.AttachedPolicies[].PolicyName')
if echo "$pol" | grep -q "^AdministratorAccess$"; then
echo " - $u"
any_admin=1
fi
done <<< "$users"
[ $any_admin -eq 0 ] && echo " [OK] Прямого админа нет (проверьте группы!)"

echo "--- Аудит завершен ---"
echo "Рекомендация: enforce MFA, ротация ключей <= ${DAYS} дн., доступ через роли вместо пользователей."

Взгляд архитектора: Без MFA и с «вечными» ключами у вас фактически перманентная сессия на проде. Считайте это инцидентом, который просто ещё не случился.

#aws #iam #security #audit #bash #cli #скрипты