
本文介绍如何基于ossutil工具,体验oss服务器端加密功能。 关于服务器端加密 OSS支持在服务器端对用户上传的数据进行加密编码(Server-Side Encryption):用户上传数据时,OSS对收到的用户数据进行加密编码,然后再将得到的加密数据持久化保存下来;用户下载数据时,OSS自动对保存的加密数据进行解密并把原始数据返回给用户,并在返回的HTTP请求Header中,声明该数据进行了服务器端加密。 OSS服务器端加密目前支持2种: 使用由OSS完全托管的服务端加密(简称AES256加密) 使用由KMS托管密钥的服务端加密(简称KMS加密) 详情请参考oss官网服务器端加密编码 关于ossutil ossutil工具旨在为用户提供一个方便的,以命令行方式管理OSS数据的途径。本文将使用ossutil管理文件(上传、下载、查看元数据信息等),进而体验OSS服务器端加密功能。请先安装和配置ossutil,具体参考oss官网ossutil AES256加密 本文测试用的bucket是test-oss-encryption,位于北京region.1.从本地上传1个测试文件到oss,并声明加密类型为AES256。 ossutil cp /tmp/test.file oss://test-oss-encryption/encryption_aes256_001 --meta=x-oss-server-side-encryption:AES256 说明:--meta字段用来添加http请求的header字段,这里是添加了x-oss-server-side-encryption这个header,对应value为AES256,这样OSS就会对该文件进行AES256加密了。 2.查看刚上传的文件meta信息。 ossutil stat oss://test-oss-encryption/encryption_aes256_001 输出结果类似如下:可以看到该文件的属性中已经多了一项说明:X-Oss-Server-Side-Encryption: AES256,说明该文件在服务器端已经启用了AES256加密存储 KMS加密 其实使用KMS加密跟AES256加密类似,只需声明加密算法为KMS即可。 注意: 使用KMS加密算法的前提是,用户已经开通了KMS密钥托管服务,关于该服务请参考官网主页密钥管理服务。 用户开通KMS服务后,如果向OSS上传文件时使用KMS加密方式,OSS会为用户在当前region创建主密钥,且只会创建1次。OSS为用户创建的KMS主密钥不收管理费用。 当用户使用KMS方式上传文件或读取经过KMS加密的文件时,KMS会额外收取少许加解密费用,具体请参考KMS计费标准。 下面开始体验KMS加密功能1.从本地上传1个测试文件到oss,并申明加密类型为KMS。 ossutil cp /tmp/test.file oss://test-oss-encryption/encryption_kms_001 --meta=x-oss-server-side-encryption:KMS 只需要将加密算法声明为KMS即可。 2.查看刚上传的文件meta信息。 ossutil stat oss://test-oss-encryption/encryption_kms_001 输出结果类似下面可以看到除了X-Oss-Server-Side-Encryption值为KMS外,还有1个特殊字段X-Oss-Server-Side-Encryption-Key-Id。X-Oss-Server-Side-Encryption-Key-Id对应的值d66363ea-d18a-4270-9c63-669b79ba8b78,其实就是OSS给用户在KMS上创建的主密钥的ID。 上图就是我的kms控制台截图,可以看到华北2(北京region)中有1个key, 该key前面有1个阿里云图标。这个key就是OSS给用户在华北2区域创建的主密钥,而密钥ID和我们查看oss文件meta信息时看到的一致。 文件读取 无论是AES256加密还是KMS加密,读取文件时都不需要特殊参数,OSS会自动解密并将解密后的结果返回给用户。
客户端加密是指用户数据在发送给远端服务器之前就完成加密,而加密所用的密钥的明文只保留在本地,从而可以保证用户数据安全,即使数据泄漏别人也无法解密得到原始数据。 本文介绍如何基于oss的现有python sdk版本, 通过客户端加密来保护数据。 原理介绍 用户本地维护一对rsa密钥(rsa_private_key和rsa_public_key) 每次上传object时,随机生成一个AES256类型的对称密钥data_key,然后用data_key加密原始content得到encrypt_content. 用rsa_public_key加密data_key, 得到encrypt_data_key, 作为用户的自定义meta放入请求头部,和encrypt_content一起发送到oss get object时,首先得到encrypt_content以及用户自定义meta中的encrypt_data_key 用户使用rsa_private_key解密encrypt_data_key得到data_key,然后用data_key解密encrypt_content得到原始content 注:本文用户的密钥为非对称的RSA密钥, 加密object content时用的AES256-CTR算法, 详情可参考PyCrypto Document。本文旨在介绍如何通过object的自定义meta来实现客户端加密,至于加密密匙类型及加密算法,用户可以根据自己的需要进行选择。 架构图 准备工作 python sdk的安装和使用,参考 python sdk 快速安装 安装PyCrypto库 pip install pycrypto 完整python 示例代码 # -*- coding: utf-8 -*- import os import shutil import base64 import random import oss2 from Crypto.Cipher import PKCS1_OAEP from Crypto.PublicKey import RSA from Crypto.Cipher import AES from Crypto import Random from Crypto.Util import Counter # aes 256, key always is 32 bytes _AES_256_KEY_SIZE = 32 _AES_CTR_COUNTER_BITS_LEN = 8 * 16 class AESCipher: def __init__(self, key=None, start=None): self.key = key self.start = start if not self.key: self.key = Random.new().read(_AES_256_KEY_SIZE) if not self.start: self.start = random.randint(1, 10) ctr = Counter.new(_AES_CTR_COUNTER_BITS_LEN, initial_value=self.start) self.cipher = AES.new(self.key, AES.MODE_CTR, counter=ctr) def encrypt(self, raw): return self.cipher.encrypt(raw) def decrypt(self, enc): return self.cipher.decrypt(enc) # 首先初始化AccessKeyId、AccessKeySecret、Endpoint等信息。 # 通过环境变量获取,或者把诸如“<你的AccessKeyId>”替换成真实的AccessKeyId等。 # # 以杭州区域为例,Endpoint可以是: # http://oss-cn-hangzhou.aliyuncs.com # https://oss-cn-hangzhou.aliyuncs.com # 分别以HTTP、HTTPS协议访问。 access_key_id = os.getenv('OSS_TEST_ACCESS_KEY_ID', '<你的AccessKeyId>') access_key_secret = os.getenv('OSS_TEST_ACCESS_KEY_SECRET', '<你的AccessKeySecret>') bucket_name = os.getenv('OSS_TEST_BUCKET', '<你的Bucket>') endpoint = os.getenv('OSS_TEST_ENDPOINT', '<你的访问域名>') # 确认上面的参数都填写正确了 for param in (access_key_id, access_key_secret, bucket_name, endpoint): assert '<' not in param, '请设置参数:' + param ##### 0 prepare ######## # 0.1 生成rsa key文件并保存到disk rsa_private_key_obj = RSA.generate(2048) rsa_public_key_obj = rsa_private_key_obj.publickey() encrypt_obj = PKCS1_OAEP.new(rsa_public_key_obj) decrypt_obj = PKCS1_OAEP.new(rsa_private_key_obj) # save to local disk file_out = open("private_key.pem", "w") file_out.write(rsa_private_key_obj.exportKey()) file_out.close() file_out = open("public_key.pem", "w") file_out.write(rsa_public_key_obj.exportKey()) file_out.close() # 0.2 创建Bucket对象,所有Object相关的接口都可以通过Bucket对象来进行 bucket = oss2.Bucket(oss2.Auth(access_key_id, access_key_secret), endpoint, bucket_name) obj_name = 'test-sig-1' content = "test content" #### 1 Put Object #### # 1.1 生成加密这个object所用的一次性的对称密钥 encrypt_cipher, 其中的key 和 start为随机生成的value encrypt_cipher = AESCipher() # 1.2 将辅助解密的信息用公钥加密后存到object的自定义meta中. 后续当我们get object时,就可以根据自定义meta,用私钥解密得到原始content headers = {} headers['x-oss-meta-x-oss-key'] = base64.b64encode(encrypt_obj.encrypt(encrypt_cipher.key)) headers['x-oss-meta-x-oss-start'] = base64.b64encode(encrypt_obj.encrypt(str(encrypt_cipher.start))) # 1.3. 用 encrypt_cipher 对原始content加密得到encrypt_content encryt_content = encrypt_cipher.encrypt(content) # 1.4 上传object result = bucket.put_object(obj_name, encryt_content, headers) if result.status / 100 != 2: exit(1) #### 2 Get Object #### # 2.1 下载得到加密后的object result = bucket.get_object(obj_name) if result.status / 100 != 2: exit(1) resp = result.resp download_encrypt_content = resp.read() # 2.2 从自定义meta中解析出之前加密这个object所用的key 和 start download_encrypt_key = base64.b64decode(resp.headers.get('x-oss-meta-x-oss-key', '')) key = decrypt_obj.decrypt(download_encrypt_key) download_encrypt_start = base64.b64decode(resp.headers.get('x-oss-meta-x-oss-start', '')) start = int(decrypt_obj.decrypt(download_encrypt_start)) # 2.3 生成解密用的cipher, 并解密得到原始content decrypt_cipher = AESCipher(key, start) download_content = decrypt_cipher.decrypt(download_encrypt_content) if download_content != content: print "Error!" else: print "Decrypt ok. Content is: %s" % download_content
简介 网站远程附件功能是指将用户上传的附件直接存储到远端的存储服务器,一般是通过FTP的方式存储到远程的FTP服务器。 目前Discuz论坛、phpwind论坛、Wordpress个人网站等都支持远程附件功能。 将附件远程存储到oss后,用户访问附件时将直接从oss下载,一方面可以减少网站的流量,同时附件本身的可用性也将提高。 一、下载并运行OSS FTP OSS FTP工具是一个特殊FTP server, 它接收普通FTP请求后,将对文件、文件夹的操作映射为对OSS的操作,从而使得您可以基于FTP协议来管理存储在OSS上的文件。 下载OSS FTP windows: ossftp.1.0.1.win.zip 注意,由于windows不会默认安装Python2.7, 所以安装包中包含了Python2.7, 免去您python安装配置的麻烦,解压即可使用。 Linux/Mac: ossftp.1.0.1.linux.mac.zip 由于Linux/Mac系统默认会安装python2.7或python2.6,所以安装包中不再包含可执行的python, 只包含了相关依赖库。 运行OSS FTP 首先解压之前下载的文件,然后根据环境情况选择不同的运行方式 windows: 双击运行start.vbs即可 Linux: 打开终端,运行 $ bash start.sh Mac: 双击start.command,或者在终端运行 $ bash start.command 上述步骤会启动一个FTP server, 默认监听在127.0.0.1的2048端口。同时,为了方便您对FTP server的状态进行管控,还会启动一个web服务器,监听在127.0.0.1的8192端口。 二、网站远程附件设置 下面以Wordpress为例,介绍如何将附件通过OSS FTP工具远程存到oss。 准备工作 申请OSS账号,并且创建一个 public-read 的bucket。这里需要权限为public-read是因为后面需要匿名访问。 详细步骤 wordpress本身是不支持远程附件功能的,但是可以通过第三方的插件来做远程附件。作者所用wordpress版本为 4.3.1 , 所用插件为 Hacklog Remote Attachment ,以下为具体设置步骤 登录wordpress站点,选择安装插件,搜关键词FTP,选择 Hacklog Remote Attachment 安装 设置 FTP服务器地址, 即运行ossftp工具的地址,一般填 127.0.0.1 即可. FTP服务的端口号,默认为 2048 . FTP登录用户名,格式为“ AccessKeyID/BukcetName ”,注意这里的' / '不是' 或 '的意思. FTP的登录密码,为 AceessKeySecrete . 关于AccessKeyID和AceessKeySecrete的获取,可以登录阿里云控制台的Access Key管理进行查看 FTP超时时间, 默认设置为30秒即可. 远程基本URL填 http://BucketName.Endpoint/wp. 这里测试所用bucket为test-hz-jh-002, 属于杭州区域的,所以这里填写的是http://test-hz-jh-002.oss-cn-hangzhou.aliyuncs.com/wp FTP远程路径, 填wp表示所有附件都会存储在bucket的wp目录下。 注意6和7要对应起来 HTTP远程路径, 填.即可 具体信息见下图的配置 验证 设置好之后,点击保存的同时,会做测试,测试结果会在页面上方显示,如下图所示表示测试成功 发布新文章, 并插入图片 现在开始写一篇新文章,并测试远程附件。创建好文章后,点击添加媒体来上传附件 上传附件如下图所示 上传完附件,点击发布,即可看到文章了。 右键点击图片,通过新建链接来打开图片即可看到图片的URL如下图所示 通过图片的URL,我们可以判定图片已经成功上传到了OSS
-------------------------
你把config.json 中的bucket_endpoint里面的配置清空再保存下,应该就可以运行了。
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------
-------------------------