
Outil automatisé d'audit de sécurité cloud qui détecte les utilisations abusives des credentials AK/SK en auditant périodiquement les logs des plateformes cloud à l'aide de la détection d'anomalies, des règles de liste noire et de l'analyse de base pour Tencent Cloud et AWS.
cloud-audit (Assistant d'audit de sécurité cloud) est un outil pour détecter les fuites AK/SK des fournisseurs de cloud public. Il audite les journaux en appelant régulièrement les API de la plateforme cloud et détecte les comportements suspects basés sur des anomalies / signatures noires / lignes de base.
Actuellement, seuls Tencent Cloud et AWS sont pris en charge.
Étape 1 : Exécutez les commandes pour installer les dépendances
cd /opt/ && git clone https://github.com/al0ne/cloud-audit
cd cloud-audit && pip3 install -r requirements.txt
Étape 2 : Créez et modifiez la configuration .env
cp .env.example .env
Remplissez le fichier .env selon votre configuration réelle
# Informations AK/SK de Tencent Cloud, nécessaires pour appeler l'API et obtenir les journaux
TencentAccessKey="xxx"
TencentSecretKey="xxx"
# Liste des AK/SK à surveiller sur Tencent Cloud
AccesskeyList="xxx,xxx,xxx"
# Informations AK/SK AWS
AWS_ACCESS_KEY_ID="xxx"
AWS_SECRET_ACCESS_KEY="xxx"
# Informations de notification Discord
discord_webhook_url=""
# Notification robot WeChat Work
weixin_webhook_url=""
Étape 3 : Configuration importante du programme
# Plages d'adresses fiables ; les opérations sensibles depuis des plages non fiables déclenchent une alerte.
while_cidr = ["192.168.0.0/16", "172.16.0.0/12", "10.0.0.0/8"]
# Régions AWS à surveiller ; les événements en dehors de ces régions ne seront pas interrogés
aws_region = [
"us-east-1",
"us-east-2",
"ap-northeast-1",
"ap-southeast-1"
]
Exécution
python3 cloud-audit.py
Le programme exécute une recherche toutes les 15 minutes.
Comme les journaux AWS sont lus et audités via le service AWS CloudTrail, assurez-vous que votre compte IAM dispose de l'autorisation AWSCloudTrail_ReadOnlyAccess pour utiliser cet outil, sinon l'erreur suivante apparaîtra :
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
Allez dans la console AWS IAM, sélectionnez l'utilisateur puis ajoutez l'autorisation dans la section 'Permissions'.
Lors de l'utilisation d'outils ciblant les plateformes cloud, leurs actions incluent généralement l'analyse de toutes les régions pour trouver des instances RDS, des instances ECS ou des conteneurs, la création/suppression de sous-comptes, l'exécution de commandes, etc. Ces actions sont elles-mêmes considérées comme sensibles, donc elles sont récupérées via les interfaces de journaux des plateformes cloud.
Une autre approche repose sur les opérations sensibles provenant de plages d'adresses non fiables. Normalement, les appels proviennent du réseau interne IDC ou des IP de sortie IDC. Si un appel AK/SK provient d'une plage non approuvée par l'entreprise et concerne une opération à haut risque, une alerte est déclenchée.
Exemples d'opérations clés sensibles courantes :
La principale différence entre Tencent Cloud et AWS est que Tencent Cloud permet d'interroger les actions détaillées d'un AK ID via son API, tandis qu'AWS ne permet de rechercher que sur la plateforme, sans pouvoir interroger les informations récentes d'un AK ID via l'API AK/SK.
Par conséquent, pour détecter l'utilisation d'AK/SK Tencent Cloud, vous devez fournir la liste des AK ID utilisés par vos services en production et consulter périodiquement les actions exécutées par chaque AK ID.
AWS ne permet d'obtenir les journaux que par région et par action. En appelant l'API CloudTrail avec AK/SK, on vérifie s'il existe des journaux pour une action donnée dans une région donnée.
AWS se base donc davantage sur des lignes de base pour juger.
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}\n账号ID:{arn}\nRegion:{awsRegion}\nAccessKey ID:{accessKeyId}\n"
f"执行动作:{eventName}\nIP地址:{sourceIPAddress}\nUser-Agent:{userAgent}\n\n"
f"检测到有外部IP请求列实例信息,请注意是否为攻击者利用!"
send_message(message)
Captures d'écran d'alerte Discord



Actuellement, la détection repose uniquement sur le comportement. À l'avenir, elle pourrait également se baser sur des lignes de base.