AWS (IAM Audit): Пользователи без MFA и «древние» access-keys
Боль: В компании сотни IAM-юзеров. Кто-то без MFA, у кого-то ключи живут годами.
Реакция админа: «Сделаем раз в квартал ручную проверку».
Реакция архитектора: «Автоматизировать и зафиксировать SLO по возрасту ключей.»
Скрипт (Bash + awscli + jq). Показывает: пользователей без MFA; access-keys старше N дней; прямой AdministratorAccess.
Взгляд архитектора: Без MFA и с «вечными» ключами у вас фактически перманентная сессия на проде. Считайте это инцидентом, который просто ещё не случился.
#aws #iam #security #audit #bash #cli #скрипты
Боль: В компании сотни 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 #скрипты