
Автоматизированный инструмент аудита безопасности облачных платформ, который выявляет неправомерное использование учетных данных AK/SK путем периодического аудита журналов облачных платформ с использованием обнаружения аномалий, списков блокировки и базового анализа для Tencent Cloud и AWS.
cloud-audit (Помощник по аудиту облачной безопасности) — это инструмент для обнаружения использования скомпрометированных AK/SK (ключей доступа/секретных ключей) публичных облачных провайдеров. Он регулярно вызывает API облачных платформ для аудита журналов и выявляет подозрительные действия на основе аномального поведения, чёрных признаков и базовых линий.
В настоящее время поддерживаются только Tencent Cloud и AWS.
Шаг 1: Установка зависимостей
cd /opt/ && git clone https://github.com/al0ne/cloud-audit
cd cloud-audit && pip3 install -r requirements.txt
Шаг 2: Создание и изменение конфигурации .env
cp .env.example .env
Заполните файл .env в соответствии с вашей реальной конфигурацией.
# Информация об AK/SK Tencent Cloud, необходима для вызова API и получения журналов
TencentAccessKey="xxx"
TencentSecretKey="xxx"
# Список отслеживаемых AK/SK в Tencent Cloud
AccesskeyList="xxx,xxx,xxx"
# Информация об AK/SK AWS
AWS_ACCESS_KEY_ID="xxx"
AWS_SECRET_ACCESS_KEY="xxx"
# Уведомление Discord
discord_webhook_url=""
# Уведомление WeChat Work Bot
weixin_webhook_url=""
Шаг 3: Важные настройки программы
# Доверенные подсети. Чувствительные операции из недоверенных подсетей вызывают немедленное предупреждение.
while_cidr = ["192.168.0.0/16", "172.16.0.0/12", "10.0.0.0/8"]
# Регионы AWS для отслеживания. События из других регионов не запрашиваются.
aws_region = [
"us-east-1",
"us-east-2",
"ap-northeast-1",
"ap-southeast-1"
]
Запуск
python3 cloud-audit.py
Программа выполняет поиск результатов каждые 15 минут.
Поскольку журналы AWS читаются и аудируются с помощью AWS CloudTrail, убедитесь, что у вашей учётной записи есть права IAM AWSCloudTrail_ReadOnlyAccess, иначе возникнет следующая ошибка:
botocore.exceptions.ClientError: An error occurred (AccessDeniedException) when calling the LookupEvents operation: User: arn:aws:iam::xxxxx:user/test is not authorized to perform: cloudtrail:LookupEvents because no identity-based policy allows the cloudtrail:LookupEvents action
Перейдите в консоль IAM AWS, выберите пользователя → Разрешения, чтобы добавить соответствующие права.
При использовании инструментов, нацеленных на облачные платформы, типичные действия включают: сканирование всех регионов на наличие экземпляров RDS, EC2 или контейнеров; создание/удаление подаккаунтов; выполнение команд. Эти действия считаются чувствительными, и мы получаем информацию о них через журналы API облачных платформ.
Другой подход — обнаружение чувствительных операций из недоверенных подсетей. Обычно вызовы происходят из внутренней сети ЦОД или через внешний IP ЦОД. Если AK/SK вызываются из недоверенной сети предприятия и выполняют опасные операции, немедленно генерируется предупреждение.
Примеры распространённых чувствительных операций:
Основное отличие Tencent Cloud от AWS API заключается в том, что Tencent Cloud позволяет через API запрашивать детальные действия конкретного AK ID, в то время как в AWS можно только искать на платформе, но нельзя через AK/SK вызывать интерфейс для получения последних действий определённого AK ID.
Поэтому для обнаружения использования AK/SK в Tencent Cloud необходимо указать список отслеживаемых AK ID, используемых в онлайн-бизнесе, и периодически проверять, какие действия выполнялись с этими AK ID.
В AWS журналы можно получать только по региону и действию. Используя AK/SK, мы вызываем CloudTrail, чтобы проверить, есть ли журнал для определённого действия в определённом регионе.
Поэтому в AWS обнаружение в основном основано на базовых линиях.
def DescribeInstances(CloudTrailEvent: dict):
"""
Обнаружение использования AK/SK для перечисления EC2
:param CloudTrailEvent:
:return: None
"""
accessKeyId = CloudTrailEvent.get('userIdentity').get('accessKeyId')
arn = CloudTrailEvent.get('userIdentity').get('arn')
eventTime = utc_to_china_tz(CloudTrailEvent.get('eventTime'))
eventName = CloudTrailEvent.get('eventName')
awsRegion = CloudTrailEvent.get('awsRegion')
sourceIPAddress = CloudTrailEvent.get('sourceIPAddress')
userAgent = CloudTrailEvent.get('userAgent')
sip_verify = False
for cidr in while_cidr:
if ipaddress.ip_address(sourceIPAddress) in ipaddress.ip_network(cidr):
sip_verify = True
if not sip_verify and 'aws-internal' not in userAgent:
message = f"{text_title}\nВремя: {eventTime}\nID аккаунта: {arn}\nРегион: {awsRegion}\nAccessKey ID:{accessKeyId}\n"
f"Выполненное действие: {eventName}\nIP-адрес: {sourceIPAddress}\nUser-Agent: {userAgent}\n\n"
f"Обнаружен внешний IP-запрос на перечисление экземпляров. Обратите внимание, не является ли это злоумышленником!"
send_message(message)
Скриншот уведомления Discord



В настоящее время обнаружение основано только на поведении, но в будущем можно добавить обнаружение по базовым линиям.