2017年11月26号腾讯云推出了云审计(CloudAudit)服务,该服务可以记录云账户资源操作,提供操作记录查询,并可以将记录文件保存到用户指定的COS存储空间。这份记录不仅仅可以记录主账号的操作,还可以记录这个主账号的子账号的操作记录。假如用户开通了云审计服务以后,用户便可以清晰的知道自己的云账户中的资源被哪个账号在什么时候从哪个IP发起过什么操作。
上面的描述有点拗口,那到底云审计给用户带来了什么呢?
- 用户(包含子账号)在腾讯云上的操作日志可以查询。
- 云审计提供了云API可以供用户调用。
- 云审计提供了PHP版本的SDK更加方便用户去查询自己的日志。
- 云审计还提供了腾讯云实验室教程,手把手引导用户来查询自己的日志,是不是很贴心。
用户如果很关心自己的账户安全的话,不妨试一试云审计,实时监控自己的腾讯云账户。当敏感操作发生以后及时告知到自己。
说了怎么多,到底应该怎么充分利用云审计来监控账户的安全呢?
假如我们的目的是:监控自己的账号是否在不是特定的IP发生过登录,如果是则及时告警。那么我们肯定会有以下疑问。
- 云审计提供的日志格式是什么样的?
- 这样的日志里哪个字段可以标识登录,换句话说登录对应的日志是那一条?
- IP又是哪个字段标识?
- 怎么检索这个日志?
- 要是真的检索到了异常操作怎么及时通知到我啊?
现在怀着一脸懵逼的心情来探索一下,如何实现使用云审计实时监控腾讯云账户。
首先,云审计的日志格式是什么样的?
啥也不说,先上个审计日志的例子,然后再给出每个字段的详细含义。以下便是审计日志的一条登录日志的实例。出于安全的考虑,我把账号还有IP做了打码操作。
代码语言:txt复制{
"userIdentity": {
"type": "Root",//账号类型
"principalId": "1150xxxxxx",//当前操作账号ID
"accountId": 1150xxxxxxx,//主账号ID
"userName": "root",
"secretId": "",
"sessionContext": {
"userIp": "127.0.0.1"
}
},
"eventTime": "2018-01-02 21:50:51",
"eventVersion": "1.0",
"eventSource": "cloud.tencent.com/login",
"requestParameters": {
"s_url": "cloud.tencent.com"
},
"sourceIPAddress": "127.0.0.1",
"eventRegion": "gz",
"eventName": "ConsoleLogin",
"resourceType": "account",
"userAgent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
"errorCode": 0,
"errorMessage": "",
"additionalEventData": {
"LoginType": "qq",//账号登录类型
"LoginTo": "https://console.cloud.tencent.com/cloudaudit",//登录成功后跳转到的页面
"MFAUsed": "No"//此次登录是否开启了MFA验证
},
"requestID": "38a3b876d45c9a4d569359ec2e87d633",
"eventID": "7fbfd66c5d5af7e6ea7f209f6bf769b71",
"eventType": "ConsoleLogin",
"apiVersion": "1.0",
"resources": "*",
"resourceName": "*"
}
原来登录一下便产生了怎么丰富的日志啊,那这个日志的每个字段的含义是什么啊?
字段 | 描述 |
---|---|
userIdentity | 账户基本信息 |
eventTime | 事件发生的时间 |
eventVersion | 日志版本目前是1.0 |
eventSource | 事件源 |
requestParameters | 事件发生时的请求参数 |
sourceIPAddress | 发起操作的IP |
eventRegion | 发起操作的资源的地域 |
eventName | 事件名称 |
resourceType | 资源类型 |
userAgent | 客户端 |
errorCode | 错误码 |
errorMessage | 错误信息 |
additionalEventData | 额外参数 |
requestID | 请求ID |
eventID | 事件ID |
eventType | 事件类型 |
apiVersion | API版本 |
resources | 资源 |
resources | 资源名称 |
然后,怎么丰富的日志里,哪个字段可以标识登录呢?
在上面的日志字段里面,有一个字段叫做事件名称,其中这个字段便可以标识登录事件。当eventName是ConsoleLogin的时候,即标识了这个字段。(PS:我不想监控登录了,我想监控机器重启,怎么确定这个字段的值呢?这个暂时可以参考https://cloud.tencent.com/document/api,其中API概览里面的ActionName即是这个字段的值。)
接着IP又是哪个字段标识?
经过上面两个问题的解释,这个问题好像是废了。sourceIPAddress这个字段就是发起操作的IP了。
最关键的问题,怎么检索这个日志?
审计日志中最关键的便是检索日志了,所以腾讯云提供了两种方案供用户来做选择。
- 在控制台上进行检索。首先,打开云审计的控制台(https://console.cloud.tencent.com/cloudaudit)。云审计控制台然后,再进行关键字搜索,假如要搜索登录事件的话,便在输入框中输入ConsoleLogin即可。(PS:日志会有5到15分钟的延迟)最后,便可以看到搜索结果了。这种方式,适合人工来查看审计日志详情。但是不能够自动化的做账户监控。如果用户想要做自动化的监控的话,可以试试下面的方式。
- 调用云API进行检索。(目前仅支持PHP版本的SDK)
以使用PHP SDK为例,如何监控登录事件。
首先,下载PHP的SDK(http://devcloudaudit-1254962721.cosgz.myzijiebao.com/qcloudapi-sdk-php-master.tar)。
然后,将这个SDK代码解压,编辑demo.php。
代码语言:txt复制<?php
error_reporting(E_ALL ^ E_NOTICE);
require_once './src/QcloudApi/QcloudApi.php';
$config = array('SecretId'=> 'AKXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX','SecretKey'=> 'hDXXXXXXXXXXXXXXXXXXXXXXXXXXXXX','RequestMethod' => 'GET','DefaultRegion' => 'gz');
$ca = QcloudApi::load(QcloudApi::MODULE_CLOUDAUDIT, $config);
$nowTime = time();
$startTime = $nowTime-120;
$alarmAction = 'ConsoleLogin'; //您认为是敏感的action
$package = array('EndTime'=>$nowTime,'LookupAttributes'=>'[{"AttributeKey":"string","AttributeValue":"'.$alarmAction.'"}]','MaxResults'=>10,'StartTime'=>$startTime);
$a = $ca->LookUpEvents($package);
if ($a === false) {
$error = $ca->getError();
echo "Error code:" . $error->getCode() . ".n";
echo "message:" . $error->getMessage() . ".n";
echo "ext:" . var_export($error->getExt(), true) . ".n";
} else {
var_dump($a);
}
$response = $ca->getLastResponse();
$response = json_decode($response,true);
$events = $response['data']['Events'];
$alarmFlag = false;
foreach ($events as $event){
if($event['EventName'] == $alarmAction){
$alarmFlag = true;
}
}
$alarmContent = '';
if($response['code'] != 0){
$alarmContent = 'API failed';
}else if ($alarmFlag === true){
$alarmContent = $alarmAction .'IsOccur!';
}
if($alarmContent != ''){
$cmd = 'cagent_tools alarm '.$alarmContent;
shell_exec($cmd);
}
其中代码里面的SecretId和SecretKey两个变量是用户调用腾讯云API的凭证。可以在这里获取(https://console.cloud.tencent.com/cam/capi)。细心的读者会发现在代码的倒数第二行有一句话,shell_exc($cmd);执行shell命令的,而shell命令的值是cagent_tools alarm $alarmContent。这个不是标准的shell命令啊。是不是还要装什么依赖?这样便引出了最后一个疑问。
最后,要是真的检索到了异常操作怎么及时通知到我啊?
腾讯云同样提供了免费短信通知的功能(但是条数有限:1000条),同时提供了命令行发送工具cagent_tools,没错就是上面的shell命令中的cagent_tools。具体使用方式可以参考:https://cloud.tencent.com/document/product/248/6218。
感谢您看到了文章的最后,如果您觉得这篇文章的描述条理不够清晰的话。您可以试试腾讯云实验室提供的关于云审计的教程(https://cloud.tencent.com/developer/labs/lab/10328)。再次感谢您,如果还有疑问的话,可以参考https://cloud.tencent.com/product/cloudaudit。如果在使用上发现问题,或者想提建议的话。我们非常欢迎,可以加入腾讯云云审计讨论组。