POST-内容审查-Web通道

介绍如何调用接口对Web通道中的内容进行安全审查。

接口介绍

Web通道内容审查接口用于检测用户在Web通道中上传的共享文件内容是否违反企业或组织的数据防泄漏DLP策略,并执行允许数据传输,或阻断数据传输等响应动作。

请求方式

POST

接口地址

/skg/v1/dlp/channel/web/<协议类型>/<请求模式>

请求参数

参数名称 参数位置 是否必须 描述
<协议类型> URL参数 Web通道下支持的Web协议,如httphttps。完整的协议支持列表,可以通过获取通道详情接口取得。GET-获取通道详情
<请求模式> URL参数 指定请求模式为同步或异步。
  • sync
  • async
参数名称 参数位置 是否必须 描述
authorization header 请求中的认证信息。查阅章节获取详细信息认证
x-skg-timestamp header 当前的Timestamp。查阅章节获取详细信息认证

请求中的Body参数定义。

参数名 类型 适用状态 说明
sourceAddress String(必选) 同步和异步 请求源IP地址
user String(可选) 同步和异步 生成事件的用户名 - 支持域用户名,格式为域名\用户名。
url String(必选) 同步和异步 请求URL
httpHeader String(必选) 同步和异步 HTTP请求的头部信息
httpBodyLen int(必选) 同步和异步 HTTP请求Body长度
queryID String(必选) 同步和异步 与此请求关联的事件查询ID,保持唯一。若请求无事件生成则无法查询到事件详情。
注: queryid的值对应于第三方云服务中的流量UUID。
redaction Dict(可选) 同步和异步 脱敏功能相关。是否开启脱敏功能。具体的脱敏设置,请查阅sendBack参数。
 "redaction": {
        "enable": true # 当enable的值为true时,脱敏请求才生效
  }
sendBack Dict(可选) 同步和异步 脱敏功能相关。脱敏后内容的处理。
注: 如需使用脱敏功能,请将redaction参数值设置为true。

该字段要求输入一个必选的type属性,表示返回文件的方式,Type属性支持以下选项:

response:将脱敏后的内容返回至当前路径

httpUpload:将脱敏后的内容发送至指定URL

s3:将脱敏后的内容上传至Amazon S3存储空间

注: 此步骤同样适用于存储到SwiftCOSOSS等存储服务。具体相关配置参数,请参考章节异步模式下审查云服务存储内容的objectinfo参数
  • response:将脱敏后的内容返回至当前路径。以下为代码示例:
      "sendBack": {
        "type": "response" # 将脱敏后的内容返回至当前路径
      },
  • httpUpload:将脱敏后的内容发送至指定URL。以下为代码示例:
     "sendBack": {
        "type": "httpUpload",
        "url": "http://172.11.11.6/callback" # 将脱敏后的内容返发送至该url
      },
  • S3:将脱敏后的内容上传至云存储。以下为适用于S3的代码示例:
     "sendBack": {
            "type": "s3",
            "s3Bucket": "test",
            "s3Region": "", # 将脱敏后的文件上传到该位置。此处的值为使用s3时的region name,
    # 如果运行在EC2上并使用AWS IAM role,则以下三项可省略,则以下三项accessKey、secretKey、endpointUrl可省略
            "accessKey": "aws_accessKey",
            "secretKey": "aws_secretKey",
            "endpointUrl": ""
      },
md5 String(可选) 同步和异步 文件MD5值,用于记录和缓存加速。支持MD5和文档一同送检,也支持仅送检MD5。示例如下:
"md5":"09e066b382d4225de3c0594aa89b5fi"
uploadtype String(必选) 异步 只限于异步。支持AWS S3、阿里云OSS、腾讯云COS、Swift等云存储,以及本地文件和下载URL。
  • swift
  • oss
  • cos
  • s3
  • file
  • http
callback_url String(可选) 异步 只限于异步模式必须填写回调函数的url
objectInfo

Dict(可选)

异步 只限于异步模式并使用对象存储时使用。异步模式支持审查存储在亚马逊S3、Swfit、阿里云OSS、腾讯云COS等云服务的对象存储。具体设置参数,参阅章节:异步模式下审查云服务存储内容的objectinfo参数

请求示例

以下示例为调用接口分别在同步模式和异步模式下,发送数据至统一内容安全审查平台UCWI进行内容安全检测。

  • 同步状态:
    POST /skg/v1/dlp/channel/web/http/sync
    Content-Type: multipart/form-data; boundary=${bound}
    --${bound}
    Content-Disposition: form-data; name="metadata"
    Content-Type: application/json
    {
    "sourceAddress":"123.12.12.112",
    "user":"abc\enduser1",
    "url":"http://www.sina.com.cn/forum/post.action",
    "httpBodyLen" : 10240,
    "queryID" : "1024f306-566a-415f-9ada-1be89b9f1086",
    "httpHeader":"Host: testhost.com\r\nConnection: Keep-Alive\r\nContent-Type: text/plain\r\nContent-Length:000000010240\r\n\r\n",
    "callback_url":"http://172.22.113.49:5000/post/http"
    }
    --${bound}
    Content-Disposition: form-data; name="request"; filename="httpbody"
    Content-Type: application/octet-stream
    %HTTP BODY%

    HTTP BODY 格式:

    Film and the City: The Urban Imaginary in Canadian Cinema.

  • 异步状态:
    POST /skg/v1/dlp/channel/web/http/async
    Content-Type: multipart/form-data; boundary=${bound}
    --${bound}
    Content-Disposition: form-data; name="metadata"
    Content-Type: application/json
    {
    "sourceAddress":"123.12.12.112",
    "user":"abc\enduser1",
    "url":"http://www.sina.com.cn/forum/post.action",
    "httpBodyLen" : 10240,
    "queryID" : "1024f306-566a-415f-9ada-1be89b9f1086",
    "sendBack": {
            "type": "s3",
            "s3Bucket": "test",
            "s3Region": "", # 将脱敏后的文件上传到该位置。此处的值为使用s3时的region name,
    # 如果运行在EC2上并使用AWS IAM role,则以下三项可省略,则以下三项accessKey、secretKey、endpointUrl可省略
            "accessKey": "aws_accessKey",
            "secretKey": "aws_secretKey",
            "endpointUrl": ""
      },
    "redaction": {
            "enable": true # 当enable的值为true时,该请求才生效
      }
    "httpHeader":"Host: testhost.com\r\nConnection: Keep-Alive\r\nContent-Type: text/plain\r\nContent-Length:000000010240\r\n\r\n",
    "uploadtype":"file/s3",
    "callback_url":"http://172.22.113.49:5000/post/http"
    }
    --${bound}
    Content-Disposition: form-data; name="request"; filename="http://s3_url/httpchannel/http/http.txt"
    Content-Type: application/octet-stream
    %HTTP BODY%

Python请求示例 - HTTP通道 (同步模式)

以下示例为使用Python代码调用接口,以在同步模式下,发送HTTP通道中的文件供内容安全审查。

注: 在如下Python代码示例中,导入的Header文件ucwi_config ucwi_auth的需事先创建,如需详细参考示例,请参阅Header文件示例
# -*- coding: utf-8 -*-
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from ucwi_config import UCWIConfig
from ucwi_auth import get_headers
import requests
import json
import os
import uuid

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

# protocol value: "http" "https"
protocol = "http"
api = "/skg/v1/dlp/channel/web/{}/sync".format(protocol)
url = "{0}{1}".format(UCWIConfig.base_url, api)
file_path = "test.txt"

metadata = {
    "user": "ucwitestuser",
    # 发送数据的用户,用于内容安全审查时的策略匹配,以及内容安全审查完成后的事件显示
    "sourceAddress": "172.22.1.1",
    # 数据的源IP地址, 用于内容安全审查时的策略匹配,以及内容安全审查完成后的事件显示
    "httpBodyLen": str(os.path.getsize(file_path)),
    # 发送的HTTP包正文的大小,用于内容安全审查时的策略匹配
    "queryID": str(uuid.uuid4()),
    # 此次请求关联的UUID,需要唯一,在异步模式下,用于事件查询
    "httpHeader": "Host: 127.0.0.1\r\nConnection: Keep-Alive\r\nContent-Type: text/plain\r\nContent-Length: 10240\r\n\r\n",
    # 用户发送的HTTP包的Header,即数据包头信息
    "url": "http://172.16.0.1/post.php",
    # HTTP请求的URL地址
}

headers = get_headers()
data = {"metadata": json.dumps(metadata)}
fd = open(file_path)
files = {
    "request": fd
}
response = requests.post(url, headers=headers, data=data, files=files, verify=False)
fd.close()

if response.status_code != 200:
    print("Bad request, response code:", response.status_code)
    print(response.text)
else:
    result = response.json()
    # print(json.dumps(result, indent=4).decode('raw_unicode_escape'))
    if result["responseCode"] != 200:
        print("Bad request, response code:", result["responseCode"])
        print(result["message"])
    else:
        hint = "# 1:允许; 2:阻断;3:确认;4:删除附件;5:邮件加密;6:邮件隔离;7:终端系统加密;8:邮件内容加密;9:终端个人密钥加密"
        print("action:{}    {}".format(result["actionCode"], hint))
        if len(result["incident_info"]) == 0:
            print("not matched.")
        else:
            print(result)
            print("matched policy:")
            for policy in result["incident_info"]["matchedPolicies"]:
                print(json.dumps(policy, indent=2).encode('utf-8').decode('raw_unicode_escape'))

Python请求示例 - HTTP通道(异步模式)

以下示例为使用Python代码调用接口,以在异步模式下,发送HTTP通道中的文件供内容安全审查。

注: 在如下Python代码示例中,导入的Header文件ucwi_config ucwi_auth的需事先创建,如需详细参考示例,请参阅Header文件示例
# -*- coding: utf-8 -*-
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from ucwi_config import UCWIConfig
from ucwi_auth import get_headers
import requests
import json
import uuid
import os

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

# protocol value: "http" "https"
protocol = "http"
api = "/skg/v1/dlp/channel/web/{}/async".format(protocol)
url = "{0}{1}".format(UCWIConfig.base_url, api)
file_path = "test.txt"

metadata = {
    "user": "ucwitestuser",
    # 发送数据的用户,用于内容安全审查时的策略匹配,以及内容安全审查完成后的事件显示
    "sourceAddress": "172.22.1.1",
    # 数据的源IP地址, 用于内容安全审查时的策略匹配,以及内容安全审查完成后的事件显示
    "httpBodyLen": str(os.path.getsize(file_path)),
    # 发送的HTTP包正文的大小,用于内容安全审查时的策略匹配
    "queryID": str(uuid.uuid4()),
    # 此次请求关联的UUID,需要唯一,在异步模式下,用于事件查询
    "httpHeader": "Host: 127.0.0.1\r\nConnection: Keep-Alive\r\nContent-Type: text/plain\r\nContent-Length: 10240\r\n\r\n",
    # 用户发送的HTTP包的Header,即数据包头信息
    "url": "http://172.16.0.1/post.php",
    # HTTP请求的URL地址
    "uploadtype": "file",
    "callback_url": UCWIConfig.callback_url + "/web"
}

headers = get_headers()
data = {"metadata": json.dumps(metadata)}
fd = open(file_path)
files = {
    "request": fd
}
response = requests.post(url, headers=headers, data=data, files=files, verify=False)
fd.close()

if response.status_code != 200:
    print("Bad request, response code:", response.status_code)
    print(response.text)
else:
    result = response.json()
    print(result["message"])

Java请求示例 - HTTP通道 (同步模式)

以下示例为使用Java代码调用接口,以在同步模式下,发送HTTP通道中的文件供内容安全审查。

import java.util.HashMap;
import java.util.Iterator;
import java.util.Properties;
import java.util.UUID;
import java.io.File;
import java.io.FileInputStream;
 
import javax.net.ssl.SSLContext;
import java.security.cert.X509Certificate;
 
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.util.EntityUtils;
 
public class TestHttp {
 
    public static String inspectHttpFile(File file) {
 
        String host = "<UCWI_HOST>";
        String port = "<UCWI_PORT>";
        String apiPath = "/skg/v1/dlp/channel/web/http/sync";
        String url = "https://" + host + ":" + port + apiPath;
 
        String queryId = UUID.randomUUID().toString();
 
        JSONObject metadataJson = new JSONObject();
        metadataJson.put("user", "cloudtest\\httpuser");
        metadataJson.put("sourceAddress", "172.22.117.242");
        metadataJson.put("httpBodyLen", "987111");
        metadataJson.put("queryID", queryId);
        metadataJson.put("httpHeader", "Host: testhost.com");
        metadataJson.put("url", "http://172.16.0.1/post.php");
 
        HttpPost post = new HttpPost(url);
 
        post.addHeader("Authorization", "<Authorization>");
        post.addHeader("x-skg-timestamp", "<timestamp>");
 
        CloseableHttpClient client = HttpClients.createDefault();
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
                public boolean isTrusted(X509Certificate[] chain, String authType) {
                    return true;
                }
            }).build();
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier());
            client = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        }
        catch (Exception e){
            e.printStackTrace();
        }
 
        String metadataString = metadataJson.toJSONString();
 
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        StringBody metadataPart = new StringBody(metadataString, ContentType.TEXT_PLAIN);
        builder.addPart("metadata", metadataPart);
 
        FileBody filePart = new FileBody(file);
        builder.addPart("request", filePart);
 
        HttpEntity multipart = builder.build();
        post.setEntity(multipart);
        String result = "";
        try {
            CloseableHttpResponse resp = client.execute(post);
            HttpEntity entity = resp.getEntity();
            result = EntityUtils.toString(entity, "UTF-8");
        }
        catch (Exception e){
            e.printStackTrace();
        }
 
        return result;
    }
 
    public static void main(String []args) {
        String filepath = "/tmp/file1";
        File f = new File(filepath);
        String result = inspectHttpFile(f);
        System.out.println(result);
    }
}

cURL请求示例 - HTTP通道 (异步模式)

按照如下示例使用cURL调用接口在Web通道中进行内容审查。

以下示例适用于上传类型为S3的情况:
  • 带callback:
    curl -F 'metadata={"uploadtype": "s3", "callback_url": "http://172.22.113.12:9999/post/http", "url": "http://172.22.78.100/post.php", "httpBodyLen": "987056", 
    "queryID": "3d6aa370-4b4c-11e7-81f7-9ef3ee527981", "user": "hwsh1\\hwsh0410enduser1", "sourceAddress": "192.168.100.1", 
    "httpHeader": "Host: hwbj1.com\r\nConnection: Keep-Alive\r\nContent-Type: multipart/form-data; boundary=---------------------------289549027074\r\nContent-Length:  987056\r\n\r\n"}' 
    -F 'request=http://172.22.78.91:8070/test-http/home/test/http/dlp.docx' https://172.22.78.107:5443/skg/v1/dlp/channel/web/http/async
  • 不带callback:
    curl -F 'metadata={"uploadtype": "s3", "url": "http://172.22.78.100/post.php", "httpBodyLen": "987056", "queryID": "66883380-4b2e-11e7-81f7-9ef3ee527981", 
    "user": "hwsh1\\hwsh0410enduser1", "sourceAddress": "192.168.100.1", 
    "httpHeader": "Host: hwbj1.com\r\nConnection: Keep-Alive\r\nContent-Type: multipart/form-data; boundary=---------------------------289549027074\r\nContent-Length:  987056\r\n\r\n"}' 
    -F 'request=http://172.22.78.91:8070/test-http/home/test/http/dlp.docx' https://172.22.78.107:5443/skg/v1/dlp/channel/web/http/async

返回参数

内容审查请求返回结果中包含以下参数:

名称 描述
result 请求是否成功,成功为0,失败为1
actionCode 请求成功时,用户可选择对符合请求条件的内容进行默认操作,默认操作包括1-允许数据传输和2-阻断数据传输
errorCode 请求失败时返回的错误代码
message 请求失败时返回的错误消息

返回示例

内容审查请求的回复如下。

  • 请求成功:
    {
    "result" : 0,
    "actionCode" : 1/2
    }
    actionCode: 1 - allow, 2 - block
    注: 若匹配策略,发现违规内容,系统还将返回策略匹配信息,具体请参照送检策略匹配返回值定义
  • 请求失败:
    {
    "result" : 1,
    "errorCode" : 500,
    "message" : "Invalid parameter"
    }

错误代码

若调用出现错误,将返回以下错误代码:
错误码 描述
400 无效参数
404 未知错误,例如请求了未触发的事件等。
500 无效参数