Безсерверные системы и безопасность функций
Выявляйте уникальную поверхность атак безсерверных функций (чрезмерно привилегированные роли IAM, внедрение событий, риски зависимостей) и применяйте принцип минимальных привилегий и проверки входных данных.
«Безсерверные системы и безопасность функций» — бесплатный урок Security+ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Security+ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Security+ Academy содержит 4 уроков всего.
Что такое бессерверные вычисления
Бессерверные вычисления (Functions as a Service, FaaS) позволяют разработчикам развертывать отдельные функции, которые запускаются событиями — HTTP-запросами, сообщениями очереди, триггерами базы данных или таймерами по расписанию, — без управления базовыми серверами. К ведущим платформам относятся AWS Lambda, Google Cloud Functions и Azure Functions. Облачный поставщик управляет установкой исправлений, масштабированием и инфраструктурой. Хотя это снижает операционную нагрузку, модель распределения ответственности за безопасность меняется: поставщик защищает среду выполнения, а разработчик несет полную ответственность за код функций, разрешения и конфигурацию.
Уникальная поверхность атак бессерверных приложений
Бессерверные функции имеют особую поверхность атак по сравнению с традиционными приложениями: обычно они краткоживущие (от секунд до минут), поэтому традиционные EDR и мониторинг сети менее эффективны; они управляются событиями, то есть запускать их могут многочисленные источники входных данных (события S3, API Gateway, SNS); часто они выполняются с разрешениями IAM, дающими доступ к другим облачным ресурсам; кроме того, они используют сторонние зависимости (пакеты npm и pip), которые могут содержать вредоносный код. Поверхность атак определяется входными данными событий, разрешениями IAM и цепочками доверия зависимостей.
Чрезмерно привилегированные роли IAM: главная угроза
Наиболее распространенная уязвимость безопасности бессерверных приложений — чрезмерно привилегированные роли IAM. Когда разработчику нужно предоставить функции доступ к одному хранилищу S3, возникает соблазн назначить s3:* (полный доступ к S3), чтобы избежать ошибок разрешений. Скомпрометированная или уязвимая функция с такой ролью сможет читать, записывать или удалять данные в любом хранилище учетной записи. Защита заключается в строгом применении ролей IAM с минимальными привилегиями: у каждой функции должна быть отдельная роль, предоставляющая только минимальные разрешения, необходимые для конкретных задач этой функции. Такие инструменты, как AWS IAM Access Analyzer и Cloudsplaining, автоматически выявляют чрезмерно привилегированные роли Lambda.
# IAM policy: least privilege for specific Lambda function
{
'Version': '2012-10-17',
'Statement': [{
'Effect': 'Allow',
'Action': ['s3:GetObject'],
'Resource': 'arn:aws:s3:::my-specific-bucket/uploads/*'
}]
}Атаки с внедрением событий
Внедрение событий происходит, когда данные, контролируемые злоумышленником, из полезной нагрузки события небезопасно обрабатываются кодом функции. Поскольку бессерверные функции могут запускаться из множества источников событий — HTTP-заголовков, параметров запроса, записей об изменениях базы данных, тел сообщений очереди и содержимого электронных писем, — любой из них может содержать вредоносную полезную нагрузку. К распространенным видам внедрения относятся: внедрение SQL, если функция обращается к базе данных с использованием данных события; внедрение NoSQL (операторы MongoDB в полезных нагрузках JSON); внедрение команд, если данные события используются в командах OS; и SSRF (подделка запросов на стороне сервера), если выполняется обращение по URL из данных события. Проверка входных данных и параметризованные запросы — важнейшие средства защиты.
# Vulnerable: event data used directly in shell command
# const filename = event.filename;
# exec('convert ' + filename + ' output.jpg');
# Safe: validate and sanitize input
# const filename = path.basename(event.filename);
# if (!/^[a-z0-9_-]+\.(jpg|png)$/i.test(filename)) throw new Error('Invalid');
# execFile('convert', [filename, 'output.jpg']);Риск зависимостей: сторонние пакеты
Бессерверные функции часто зависят от десятков сторонних пакетов. Эти зависимости создают риск для цепочки поставок: вредоносный или скомпрометированный пакет может выполнить произвольный код в среде выполнения функции, получить доступ к переменным окружения (которые часто содержат секреты), установить исходящие сетевые соединения и использовать роль IAM функции для доступа к облачным ресурсам. Известные атаки, например компрометация пакета event-stream для npm в 2018 году, а также многочисленные пакеты-двойники с опечатками, демонстрируют этот риск. Защита включает закрепление зависимостей, сканирование SCA в CI/CD и минимальное количество зависимостей.
Секреты в бессерверных приложениях: переменные окружения
Бессерверные функции часто получают секреты через переменные окружения, настроенные в облачной консоли. Эти переменные окружения видны всем, у кого есть доступ IAM к конфигурации Lambda, и доступны любому коду, выполняющемуся внутри функции. Рекомендуется: не хранить секреты непосредственно в виде открытого текста в переменных окружения; вместо этого хранить ARN или имена секретов и получать секреты во время выполнения из AWS Secrets Manager или Parameter Store; включить шифрование KMS переменных окружения Lambda при хранении; никогда не записывать переменные окружения в журналы, поскольку многие средства отладки при ошибке выгружают все переменные окружения.
# Retrieve secret at runtime instead of hardcoding
# Using AWS SDK in Lambda
# const secretsClient = new SecretsManagerClient({});
# const response = await secretsClient.send(
# new GetSecretValueCommand({ SecretId: 'prod/myapp/db-password' })
# );
# const dbPassword = response.SecretString;Ограничения времени ожидания и параллелизма функций
Отказ в обслуживании бессерверных функций может принимать форму массового запуска: злоумышленник, способный многократно запускать функцию, может исчерпать лимит параллелизма учетной записи (значение по умолчанию для Lambda — 1 000 одновременных выполнений в регионе), из-за чего другие функции учетной записи не смогут выполняться. Функции, обрабатывающие входные данные, контролируемые пользователем, должны применять ограничение частоты запросов на уровне API Gateway, проверять ограничения размера полезной нагрузки и задавать подходящие значения времени ожидания, чтобы предотвращать неконтролируемо длительное выполнение. Если размер входных данных не ограничен, функции также могут подвергаться атакам расширения по типу Billion Laughs при разборе XML/YAML.
# AWS Lambda: set reserved concurrency to prevent account-wide DoS
aws lambda put-function-concurrency \
--function-name my-api-handler \
--reserved-concurrent-executions 100Интеграция с VPC и изоляция сети
По умолчанию функции AWS Lambda выполняются в управляемой AWS VPC с доступом к интернету, но без доступа к ресурсам Вашей частной VPC (базам данных RDS, ElastiCache и частным API). Для доступа к частным ресурсам Lambda необходимо настроить работу внутри Вашей VPC с определенными подсетями и группами безопасности. Однако у функций Lambda, подключенных к VPC, по умолчанию нет доступа к интернету — для исходящих подключений им нужен NAT Gateway. Группы безопасности, подключенные к функциям Lambda, должны соответствовать принципу минимальных привилегий: разрешайте только определенные порты и назначения, которые необходимы. Не используйте исходящие правила 0.0.0.0/0 для групп безопасности рабочих функций.
Мониторинг бессерверных функций
Мониторинг безопасности бессерверных приложений требует иных подходов, чем традиционный мониторинг узлов. Поскольку функции существуют недолго, агенты на узлах непрактичны. Эффективный мониторинг использует: AWS CloudTrail для записи всех вызовов API Lambda (запусков, изменений конфигурации и принятия ролей); CloudWatch Logs Insights для выполнения запросов к журналам выполнения функций в поисках аномальных закономерностей; Amazon GuardDuty для обнаружения угроз, включая необычную сетевую активность Lambda; а также коммерческие средства защиты, созданные специально для бессерверных приложений, например Protego (теперь часть Check Point), или бессерверный мониторинг Datadog, который с помощью слоев инструментирует функции и обеспечивает видимость происходящего во время выполнения.
# Query CloudWatch Logs for Lambda errors and anomalies
aws logs start-query \
--log-group-name '/aws/lambda/my-function' \
--start-time $(date -d '-1 hour' +%s) \
--end-time $(date +%s) \
--query-string 'fields @timestamp, @message | filter @message like /ERROR|WARN|credential/'Тестирование безопасности бессерверных приложений
Тестирование безопасности бессерверных приложений требует специализированных средств: PureSec CLI (теперь Check Point) и Prowler проверяют облачные конфигурации на наличие неправильных настроек бессерверных компонентов; инструменты DAST проверяют функции, запускаемые через HTTP, на наличие уязвимостей внедрения; статический анализ кода функций с помощью таких средств, как Bandit (Python) или плагины безопасности ESLint, выявляет небезопасные шаблоны программирования; при ручном тестировании следует перечислить все источники событий, способные запускать каждую функцию, и проверить каждый источник с искаженными и вредоносными полезными нагрузками. OWASP Serverless Top 10 предоставляет полный перечень уязвимостей, предназначенный для бессерверных архитектур.
# Prowler: check Lambda security posture
prowler aws --service lambda
# Checks: public URL, over-privileged roles, unencrypted env vars,
# outdated runtime, missing VPC config, excessive timeoutРаспределение ответственности в бессерверных приложениях
Бессерверные вычисления еще больше смещают модель распределенной ответственности в сторону поставщика. Облачный поставщик отвечает за среду выполнения функции, исправления OS, безопасность базовой инфраструктуры и физические объекты. Заказчик по-прежнему отвечает за безопасность кода функций, проектирование разрешений IAM, управление секретами, проверку входных данных, управление зависимостями, конфигурацию журналирования и сетевые политики. Снижение ответственности за инфраструктуру не означает снижения ответственности за безопасность — меняется лишь направление инвестиций в безопасность, прежде всего в сторону безопасности на уровне приложений и IAM.
Быстрая проверка
Проверьте, насколько хорошо Вы понимаете рассмотренные в этом уроке концепции CompTIA Security+ (SY0-701).
Итоги урока
В этом уроке Вы узнали, что чрезмерно привилегированные роли IAM являются главным риском бессерверных приложений: каждой функции нужна отдельная роль с минимальными привилегиями; атаки с внедрением событий используют любой источник событий, передающий контролируемые злоумышленником данные функциям без проверки входных данных; а риск цепочки поставок зависимостей от сторонних пакетов может скомпрометировать выполнение функции и предоставить доступ к учетным данным IAM и секретам. Далее мы рассмотрим сканирование безопасности инфраструктуры как кода, позволяющее обнаруживать неправильные конфигурации до развертывания.
Часто задаваемые вопросы
Урок «Безсерверные системы и безопасность функций» бесплатный?
Да — полный текст урока «Безсерверные системы и безопасность функций» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Security+ Academy, подпишись на CoddyKit PRO. Курс Security+ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Безсерверные системы и безопасность функций»?
Выявляйте уникальную поверхность атак безсерверных функций (чрезмерно привилегированные роли IAM, внедрение событий, риски зависимостей) и применяйте принцип минимальных привилегий и проверки входных… Ты практикуешь Security+ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Security+ Academy?
Предыдущий опыт не требуется. Security+ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Безсерверные системы и безопасность функций»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Security+ Academy?
Да. Каждый урок Security+ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Безопасность контейнеров: усиление образов и защита во время выполнения
- Безопасность Kubernetes: RBAC, сетевые политики и безопасность подов
- Безсерверные системы и безопасность функций
- Сканирование безопасности инфраструктуры как кода