Стройте ответ вокруг владения состоянием, лимитов, отказа и восстановления. Определение становится инженерным ответом только в конкретном production-сценарии.
Вопросы и ответы
9 подробных ответов
01Чем IAM-роль отличается от IAM-пользователя и почему сервису нельзя выдавать долгоживущие access-ключи?
middle
Короткий ответ: IAM-пользователь — это статичные ключи, которые живут, пока их не отзовут; роль — временные креденшелы, которые сервис получает через trust policy и которые ротируются автоматически. Воркладу всегда роль: instance profile на VM, IRSA/workload identity в Kubernetes, OIDC-federation из CI.
Подробно:
- Статичные ключи текут — попадают в git, логи и образы; сами не ротируются; отзыв ручной и обычно уже после инцидента.
- Роль = временная сессия — STS выдаёт креденшелы на часы, scoped на конкретные права; утёкшая сессия умирает сама.
- Механизм важно назвать — EC2: instance profile; EKS: IRSA/workload identity; CI: OIDC — пайплайн обменивает свой identity-токен на роль, и в настройках CI нет ни одного секрета.
| Access-ключ пользователя | Роль | |
|---|---|---|
| Срок жизни | вечный | часы (STS) |
| Ротация | ручная | автоматическая |
| При утечке | инцидент | сессия истекает сама |
⚠️ Частая ошибка: «положим ключ в секрет-менеджер». Удобнее — да, но ключ остаётся долгоживущим: проблема не в месте хранения, а в самом существовании статичного ключа.
02Спроектируйте VPC для классического трёхзвенного приложения. Что где разместите?
middle
Короткий ответ: Три слоя подсетей минимум в двух AZ: публичные — только LB и NAT gateway; приватные — приложение; изолированные — база. Из интернета напрямую достижим только LB, egress приложения идёт через NAT, у базы маршрута наружу нет вообще.
Подробно:
Internet
│
┌──────▼──────┐ public subnets (AZ-a, AZ-b)
│ ALB │ NAT │
└──────┬──────┘
┌──────▼──────┐ private subnets: app
│ app nodes │──egress──► NAT ─► Internet
└──────┬──────┘
┌──────▼──────┐ isolated subnets: data
│ DB │ (маршрута наружу нет)
└─────────────┘
- Route tables — публичные подсети смотрят на Internet Gateway; приватные — на NAT (только исходящий трафик); у изолированных выхода наружу нет вовсе.
- Цепочка секьюрити-групп — db-SG разрешает 5432 только от app-SG, app-SG — только от lb-SG: правила ссылаются на группы, а не на CIDR.
- ≥2 AZ — LB, приложение и реплика базы в разных зонах, иначе падение одной AZ кладёт всё.
Схема vendor-neutral: в Yandex Cloud те же роли играют NAT-шлюз и группы безопасности.
⚠️ Частая ошибка: сделать app-подсети публичными «чтобы ходить по SSH». Доступ — через bastion или SSM-класс агента, а не публичные IP на приложении.
03Чем секьюрити-группа отличается от NACL на практике?
junior
Короткий ответ: Секьюрити-группа stateful и висит на инстансе/ENI: разрешили входящий трафик — ответный пройдёт сам. NACL stateless и висит на подсети: обратный трафик надо разрешать явно, включая эфемерные порты; зато NACL умеет deny и порядок правил.
Подробно:
| Секьюрити-группа | NACL | |
|---|---|---|
| Уровень | инстанс / ENI | подсеть |
| Состояние | stateful — ответ проходит автоматически | stateless — обе стороны явно |
| Правила | только allow | allow + deny |
| Порядок | все правила суммируются | первое совпавшее по номеру |
| Типовая роль | основной инструмент контроля | грубый блок на всю подсеть |
На практике ~95% контроля делают секьюрити-группами; NACL добавляют точечно — например, забанить конкретный CIDR на уровне подсети, потому что deny группа не умеет.
⚠️ Частая ошибка: написать в NACL только входящее правило и удивляться таймаутам — ответный трафик уходит с эфемерных портов (1024–65535), и в stateless-списке его нужно явно разрешить в outbound.
04Как вы организуете работу с секретами между сервисами и что ротация требует от самих приложений?
middle
Короткий ответ: Центральное хранилище (Vault или облачный secrets manager), в git — только ссылки на секреты, никогда значения. Ключевое следствие: ротация — это контракт с приложением. Секрет, который нельзя ротировать без даунтайма, — отложенный инцидент.
Подробно:
- Единый источник — секреты живут в одном месте с аудитом доступа: кто, когда и какой секрет читал.
- Два способа доставки:
| Способ | Как | Цена |
|---|---|---|
| При деплое | CI/оператор инжектит в env или файл | просто, но новое значение = редеплой |
| В рантайме | приложение ходит в хранилище, кэширует с TTL | ротация без редеплоя, но хранилище — критическая зависимость |
- Ротация — требование к коду — приложение должно уметь перечитать секрет: по TTL, по сигналу или переподключением при ошибке аутентификации. Иначе ротация = даунтайм, и её «на потом» не делают годами.
- Аудит — доступ к секретам логируется; аномалия в логе — ранний сигнал компрометации.
⚠️ Частая ошибка: секреты «управляются», но ни один ни разу не ротировался. Проверка простая: сможете ли вы сменить пароль базы сегодня без остановки сервиса?
05Что даёт Vault по сравнению с зашифрованными переменными в CI?
senior
Короткий ответ: Главное — динамические секреты: Vault выпускает короткоживущие креденшелы (например, к базе) под конкретный инстанс сервиса, с lease и автоматическим отзывом. Ментальный сдвиг: секреты перестают распространяться и становятся эфемерными.
Подробно:
- Динамические секреты — сервис запрашивает доступ к БД, Vault на лету создаёт пользователя с TTL; истёк lease — креденшелы отозваны. Через час утечке нечего красть.
- Identity-based аутентификация — kubernetes auth method: под подтверждает себя service account'ом, и bootstrap-секрета у приложения нет вообще — решена «проблема нулевого секрета».
- Центральный аудит — каждый доступ к каждому секрету в логе.
- Transit — encryption-as-a-service: приложения шифруют данные, не видя ключей.
| Переменные в CI | Vault | |
|---|---|---|
| Природа | статичный, скопирован всюду | выпущен на лету, per-instance |
| Срок жизни | до ручной ротации | TTL / lease, авто-отзыв |
| Компрометация | менять везде, искать копии | отозвать lease или дождаться истечения |
| Аудит | кто читал — неизвестно | полный лог |
⚠️ Частая ошибка: внедрить Vault как «зашифрованный key-value» и раздавать из него те же вечные пароли — получается дорогая версия переменных CI, динамика не используется.
06Сканер нашёл в базовом образе 40 CVE. Ваши действия — и как не возвращаться к этому каждую неделю?
middle
Короткий ответ: Сначала триаж, а не паника: смотрим severity, эксплуатируемость и наличие фикса — из 40 CVE реально опасны обычно единицы. Затем пересборка на пропатченном минимальном базовом образе. Системно — сканер как gate в CI и автоматические обновления базового образа.
Подробно:
- Триаж — Critical/High с доступным фиксом чинить сейчас; уязвимость в библиотеке, которую контейнер даже не загружает, — понизить в приоритете. Все 40 не равны.
- Пересборка — обновить базовый образ до пропатченного, а лучше сузить поверхность: slim/distroless вместо полного дистрибутива — меньше пакетов, меньше CVE в принципе.
- Пин по digest —
image@sha256:…, а не:latest: сборка воспроизводима, обновление базы — осознанный коммит, а не сюрприз в ночной сборке. - Профилактика — сканер (класс Trivy) в CI с политикой порогов: Critical/High с фиксом блокируют сборку, шумные Low идут в отчёт; бот регулярно поднимает базовый образ отдельным PR.
⚠️ Частая ошибка: две крайности — блокировать сборку на любой CVE (команда тонет в шуме и отключает gate) или молча игнорировать все 40. Работает только политика с порогами.
07Зачем подписывать контейнерные образы и где именно проверяется подпись?
senior
Короткий ответ: Подпись решает задачу provenance в supply chain: криптографическая подпись над digest'ом образа (cosign/sigstore) доказывает, кто его собрал и что он не изменён по пути. Проверка — на admission: policy-контроллер в кластере пускает только подписанные образы.
Подробно:
- Что подписывается — не тег, а digest: тег
:v1.2можно перезаписать, sha256 — нет. Подпись хранится в том же registry рядом с образом. - Где проверяется — admission-контроллер (класс Kyverno/Gatekeeper): под с неподписанным или подписанным чужим ключом образом просто не шедулится. Проверять «при push» бессмысленно — атакующий этот шаг не выполняет.
- Сканирование ≠ подпись — это защита от разных угроз:
| Сканирование | Подпись | |
|---|---|---|
| Угроза | известные CVE в содержимом | подмена образа, чужая сборка |
| Вопрос | «что внутри уязвимо?» | «кто собрал и не трогали ли?» |
| Момент | CI + registry, периодически | admission, при каждом запуске |
Зрелый уровень — подписывать не только образ, но и attestations: SBOM, результаты сканирования, provenance сборки (SLSA).
⚠️ Частая ошибка: «у нас приватный registry, подпись не нужна». Скомпрометированный CI или учётка с push-правами кладёт вредоносный образ именно в приватный registry — подпись с проверкой на admission ловит и это.
08Почему Kubernetes Secrets по умолчанию — не совсем секреты, и что с этим делать?
middle
Короткий ответ: base64 — это кодирование, а не шифрование: раскодируется одной командой. По умолчанию секреты лежат в etcd открытым текстом и доступны любому, у кого есть доступ к etcd, широкий RBAC или root на ноде.
Подробно:
- Кто читает — доступ к etcd (и к его бэкапам!),
get secretsчерез API при щедром RBAC, root на ноде, куда под смонтировал секрет. - Минимум — включить encryption-at-rest для etcd (KMS-провайдер) и зажать RBAC:
get/listна secrets — только тем, кому реально нужно. - Правильный источник — external-secrets-оператор: в git и манифестах — ссылка, значение приезжает из Vault или облачного менеджера, там же аудит и ротация.
- Не в env — переменные окружения видны в
/proc/<pid>/environ, попадают в crash-дампы и логи «на всякий случай»; секрет файлом в томе безопаснее, и его можно обновить без рестарта пода.
| Дыра | Чем закрывается |
|---|---|
| plaintext в etcd | encryption-at-rest (KMS) |
| широкий доступ по API | строгий RBAC на secrets |
| значения в git | external-secrets + Vault |
| секреты в env | секрет как файл в томе |
⚠️ Частая ошибка: «они же в base64» как аргумент защиты. base64 -d — вот и вся «защита».
09В git-историю попал креденшел от прода. Ваши действия по шагам?
middle
Короткий ответ: Шаг ноль — ротация. Креденшел считается скомпрометированным с момента попадания в историю: копия уже могла разойтись по клонам и форкам. Только потом чистка истории и профилактика.
Подробно:
1. ротация ──► 2. аудит ──► 3. чистка истории ──► 4. профилактика
(сразу) (логи (filter-repo; (secret-scanning
доступа) форки остаются!) в pre-commit и CI)
- Ротировать немедленно — отозвать ключ, сменить пароль. Всё остальное может подождать, это — нет.
- Аудит — где креденшел использовался; по логам доступа (класс CloudTrail) проверить, не было ли с него обращений за окно утечки.
- Чистить историю —
git filter-repo+ force push, понимая ограничение: существующие клоны, форки и кэши платформы старую историю сохраняют. Чистка — гигиена, а не защита. - Профилактика — секрет-сканер в pre-commit и как CI-gate (класс gitleaks), push protection на уровне платформы.
⚠️ Частая ошибка: начать с «удалим коммит». Пока вы переписываете историю, ключ работает и уже мог быть скопирован — первым действием всегда ротация.
Источники
Источники и редакционная политика
Материалы RecallDeck сопоставлены с официальной документацией и открытыми публикациями компаний, когда первичный источник доступен. Мы не связаны с упомянутыми работодателями, не публикуем конфиденциальные задания и не продаём места в подборках. Формат найма может меняться — уточняйте его у рекрутера.
От чтения к воспроизведению
Отрепетируйте полный цикл интервью.
RecallDeck возвращает сложные темы по расписанию и помогает удерживать в памяти язык, SQL, архитектуру и поведенческие истории.