QingStor 对象存储新增 Logstash Input/Output 插件

QingStor Logstash Input/Output 插件为首届 QingStor Satellites 活动中成功孵化出的项目,在 QingStor Satellites 活动中,QingStor 团队会选择一些有意义的开源项目为课题,并作为导师指导高校学生逐步完成项目。

QingStor Logstash Input/Output 插件的开发者为 Tacinight,来自兰州大学信息科学与工程学院 DSLab 研究生一年级的同学 赵益民(下图即为赵益民同学近照)。

QingStor Logstash Input/Output 插件已经通过 QingStor 官方审核,并被收纳为 QingStor 官方的 Logstash 插件,后续将由 QingStor 官方与赵益民同学一起进行维护。

下文为简要使用文档。更多详细信息请参见 https://github.com/yunify/logstash-input-qingstor 和 https://github.com/yunify/logstash-output-qingstor

Logstash 简介

Logstash 是一款轻量级的日志搜集和处理工具,可以方便的把分散的、多样化的日志收集起来,并进行自定义的处理,然后传输到指定的目标,比如输出到 Elasticsearch 或者写入文件。Logstash 整体可大致分为三部分,即数据输入(Input)、数据加工(Filter)、数据输出(Output),同时 Logstash 内置了多种输入输出插件,方便用户对接各种第三方服务。QingStor Logstash Input/Output 插件实现了对象存储服务和 Logstash 的对接,方便用户读取存储在对象存储的日志或者上传处理后的日志到对象存储。

安装

首先确保 Logstash 已正确安装,之后使用以下命令从 Ruby Gems 安装插件。

$ bin/logstash-plugin install logstash-input-qingstor
$ bin/logstash-plugin install logstash-output-qingstor

快速开始

使用插件之前请先在 青云控制台 申请 Access Key。

Input 和 Output 插件的基本配置项如下,查看更多可用选项可访问 GitHub 项目页面进行查阅。

input {
    qingstor {
        access_key_id => "your_access_key_id"
        secret_access_key => "your_secret_access_key"
        bucket => "input_bucket_name"
        region => "pek3a"
    }
}
output {
    qingstor {
        access_key_id => "your_access_key_id"
        secret_access_key => "your_secret_access_key"
        bucket => "output_bucket_name"
        region => "pek3a"
    }
}
设置完成之后启动 Logstash,即可从对象存储读取日志文件,然后按照固定大小或固定时间切分并归档,最后输出处理后的日志文件到对象存储。
$ ./bin/logstash -f qs_input_ouput.conf

致谢

最后对 QingStor Logstash Input/Output 插件的作者 Tacinight (赵益民同学) 表示感谢,同时我们也欢迎更多高校学生或第三方开发者参与到我们的开源项目中来。

QingStor 对象存储新增 .NET SDK

QingStor 对象存储到目前为止已经发布了包括 Go、Ruby、Swift、Java、JavaScript、PHP、Python、Scala 等八种语言的 SDK,为了方便 .NET 平台的用户使用 QingStor 对象存储服务,现特新增 .NET SDK。

QingStor .NET SDK 通过开源的 QingStor 对象存储的 API Specifications(OpenAPI 格式,亦称 Swagger 2.0 格式)及 SDK 生成工具 Snips 来生成相应的SDK接口和公共基础部分,在 Snips 的帮助下使其能够在短时间内开发出符合生产环境使用的SDK。

下文为简要使用文档,更多详细信息请参见 https://github.com/yunify/qingstor-sdk-net

1. 安装

可通过以下三种安装方式任意一种安装。

  • 直接下载源码并将其添加至项目:
$ git clone https://github.com/yunify/qingstor-sdk-net.git
  • 直接添加 DLL 引用:
在 GitHub 的 Release 页面 下载相应版本的 DLL,然后将其添加至项目引用。由于此 SDK 
依赖于 Json.NET,可以添加该 SDK 对应版本的 Newtonsoft.Json.dll 引用或者使用 
NuGet来安装它:
Install-Package Newtonsoft.Json
  • 通过包管理器(NuGet)安装:
例如在 Visual Studio 2013 中,打开 NuGet 程序包管理器搜索 QingStor_SDK_NET 
或者在控制台中键入以下命令(其中,QingStor_SDK_NET45 表示 .NET Framework 4.5 
平台下的SDK):
Install-Package QingStor_SDK_NET45

2. 初始化服务

发起请求前首先建立初始化服务:

using QingStor_SDK_NET.Common;
using QingStor_SDK_NET.Service;

CConfig Config = new CConfig("Config.yaml");
CQingStor Service = new CQingStor(Config);

上面代码初始化了一个 QingStor Service。

3. 获取账户下的 Bucket 列表

CListBucketsOutput ListBuckets = Service.ListBuckets(null);

// Print the HTTP status code.
// Example: 200
Console.Write(ListBuckets.StatusCode);

// Print the bucket count.
// Example: 5
Console.Write(ListBuckets.count);

4. 创建 Bucket

初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone

CBucket Bucket = Service.Bucket("bucket-name", "pek3a");
CPutBucketOutput PutBucketOutput = Bucket.Put();

5. 获取 Bucket 中存储的 Object 列表

CListObjectsOutput ListObjectsOutput = Bucket.ListObjects(null);

// Print the HTTP status code.
// Example: 200
Console.Write(ListObjectsOutput.StatusCode);

// Print the key count.
// Example: 0
Console.Write(ListObjectsOutput.keys.Length);

6. 创建一个 Object

CPutObjectInput PutObjectInput = new CPutObjectInput();
PutObjInput.Body = new FileStream("/tmp/Screenshot.jpg", FileMode.Open);
CPutObjectOutput PutObjectOutput = Bucket.PutObject("Screenshot.jpg", PutObjectInput);

// Print the HTTP status code.
// Example: 201
Console.Write(PutObjectOutput.StatusCode);

7. 删除一个 Object

CDeleteObjectOutput DeleteObjectOutput = BucketObj.DeleteObject("Screenshot.jpg");

// Print the HTTP status code.
// Example: 204
Console.Write(DeleteObjectOutput.StatusCode);

8. 设置 Bucket ACL

CGranteeType Grantee = new CGranteeType() { id = "usr-id", type = "user" };
CACLType ACL = new CACLType() { grantee = Grantee, permission = "FULL_CONTROL" };
CPutBucketACLInput PutBucketACLInput = new CPutBucketACLInput();
PutBucketACLInput.acl = new CACLType[] { ACL };
CPutBucketACLOutput PutBucketACLOutput = Bucket.PutACL(PutBucketACLInput);

// Print the HTTP status code.
// Example: 200
Console.Write(PutBucketACLOutput.StatusCode);

控制台支持 NAS 监控、IP/端口组资源展示等

NAS 是支持基于 NFS 和 Samba(CIFS) 协议的网络共享存储服务,你可以将硬盘挂载到 NAS 服务器上,让多个客户端通过网络连接进行共享,同时支持可访问服务的账号的控制管理。

当 NAS 添加了共享存储目标后,控制台加上了对提供 NAS 服务的主机资源的监控。包括了 CPU、内存、硬盘使用率、吞吐和 IOPS、以及网络吞吐情况等监控。通过监控用户可以检查到 NAS 服务的使用情况,尤其是硬盘使用率等关键指标。

IP/端口组是具有相同特征的一组 IP 或者端口的集合,用于防火墙规则中源 IP 和端口范围的批量定义。控制台新增了在 IP/端口组列表对防火墙的展示,即使用了某个 IP/端口组的防火墙,会在相应表格项中展示出来,方便分组和过滤防火墙。

QingStor 对象存储发布 WordPress 插件

QingStor 对象存储的 WordPress 插件为首届 QingStor Satellites 活动中成功孵化出的项目,在 QingStor Satellites 活动中,QingStor 团队会选择一些有意义的开源项目为课题,并作为导师指导高校学生逐步完成项目。

QingStor 对象存储的 WordPress 插件的开发者为 yungkc,来自兰州大学信息科学与工程学院二年级的同学 杨壬 (下图即为杨壬同学近照)。

QingStor 对象存储的 WordPress 插件已经过 QingStor 官方审核,后续将由 QingStor 官方与杨壬同学一起进行维护。

下文为功能简要介绍及使用文档。更多详细信息请参见 https://github.com/yunify/wp-qingstor

主要功能

  • 手动或定时备份 WordPress 全站到 Bucket 指定前缀,并发送邮件通知
  • 添加文件到媒体库时,自动上传文件至 Bucket 的指定前缀
  • 支持在文章渲染时自动替换本地媒体文件的 URL 为相应 Bucket URL
  • 可以一键同步媒体库(一般为 wp-content/uploads)文件夹内的所有文件,方便网站迁移

安装方式

可选以下三种安装方式中的任意一种

  • 通过 WordPress 控制台 FTP 安装
  • WordPress 仓库下载 zip 包,然后解压至 wordpress/wp-content/plugins 目录即可
  • 通过 Github 的安装略有不同,因为 Github 的版本没有包含 QingStor SDK,所以安装后,要进入 QingStor 插件目录并运行以下命令:
$ composer install

使用方式

  • QingStor 设置

首先要填写 ACCESS KEY ID SECRET ACCESS KEY,以及 Bucket 名称,这三项需要在 QingCloud 控制台 手动创建。

选项 “自动设置存储空间策略” 会使插件自动设置所填 Bucket ACL “公开只读”,以及设置存储空间策略为禁止对备份文件所在前缀进行任何操作。通常该选项可以保证媒体文件的可读和备份文件的安全,如非必要,无需修改。

  • 上传设置

设置要自动上传到 Bucket 的文件后缀名以及指定 Bucket 前缀,该前缀应该与备份文件的前缀严格区分,否则会影响存储空间策略的设置。如果有多个 WordPress 站点使用了同一个 Bucket,建议为每个站点设置不同的前缀。

自动替换文件 URL:打开该选项之后,插件就会在文章渲染时自动替换本地媒体文件的 URL Bucket 上对应的文件 URL

  • 备份设置

这部分的功能很容易使用,根据需要设置好时间保存即可。指定前缀和上传设置的基本要求一样。

致谢

最后对 WordPress plugin 的作者 yungkc (杨壬同学) 表示感谢,同时我们也欢迎更多高校学生或第三方开发者参与到我们的开源项目中来。

QingStor 对象存储新增 Scala SDK

QingStor Scala SDK 为首届 QingStor Satellites 活动中成功孵化出的项目,在 QingStor Satellites 活动中,QingStor 团队会选择一些有意义的开源项目为课题,并作为导师指导高校学生逐步完成项目。

QingStor Scala SDK 的开发者为 Cheerx ,来自兰州大学信息科学与工程学院 DSLab 研究生一年级的同学 谢启荣 (下图即为谢启荣同学近照)。

QingStor Scala SDK 已经过 QingStor 官方审核,并被收纳为 QingStor 官方的 Scala SDK,后续将由 QingStor 官方与谢启荣同学一起进行维护。

下文为简要使用文档。更多详细信息请参见 https://github.com/yunify/qingstor-sdk-scala

安装

点击 此处 下载最新版的 Jar 包,也可访问 GitHub 项目的 Releases 页面查看和下载历史版本。

文件名中包含 fat 后缀的 Release 中包含了 SDK 所需的依赖,使用时无需手动加载其依赖包,如 qingstor-sdk-scala-v2.0.0_2.11_fat.jar。而文件名中不包含 fat 的 Release 中没有包含相关依赖,需要手动指定。

描述 SDK 所需依赖关系的 SBT 文件片段样例如下:

libraryDependencies ++= {
  val akkaHttpVersion = "10.0.5"
  val circeVersion = "0.7.1"
  Seq(
    "com.typesafe.akka" %% "akka-http-core" % akkaHttpVersion,
    "com.typesafe.akka" %% "akka-http" % akkaHttpVersion,
    "io.circe" %% "circe-generic" % circeVersion,
    "io.circe" %% "circe-parser" % circeVersion,
    "org.yaml" % "snakeyaml" % "1.17",
    "de.heikoseeberger" %% "akka-http-circe" % "1.15.0"
  )
}

快速开始

使用 SDK 之前请先在 青云控制台 申请 Access Key。

初始化服务

发起请求前首先建立需要初始化服务:

import com.qingstor.sdk.config.QSConfig
import com.qingstor.sdk.service.QingStor

val config = QSConfig("ACCESS_KEY_ID", "SECRET_ACCESS_KEY")
val qsService = QingStor(config)

初始化并创建 Bucket, 需要指定 Bucket 名称和所在 Zone:

import com.qingstor.sdk.service.Bucket

val bucket = Bucket(config, "test-bucket", "pek3a")
val outputFuture = bucket.put(Bucket.PutBucketInput())

获取 Bucket 中存储的 Object 列表

val outputFuture = bucket.listObjects(Bucket.ListObjectsInput())
val listObjectsOutput = Await.result(outputFuture, Duration.Inf)

// Print the HTTP status code.
// Example: 200
println(listObjectsOutput.statusCode.getOrElse(-1))

// Print the key count.
// Example: 7
println(listObjectsOutput.keys.map(_.length).getOrElse(-1))

创建一个 Object

例如一张图片:

// Open file
val file = new File("/tmp/test.jpg")
val input = PutObjectInput(
  // Because this SDK used akka-http as http library, it's useless to set Content-Length here
  contentLength = file.length().toInt,
  body = file
)
val outputFuture = bucket.putObject("test.jpg", input)
val putObjectOutput = Await.result(outputFuture, Duration.Inf)
file.close()

// Print the HTTP status code.
// Example: 201
println(putObjectOutput.statusCode.getOrElse(-1))

删除一个 Object

val outputFuture = bucket.deleteObject(arg, Bucket.DeleteObjectInput())

// Print the HTTP status code.
// Example: 204
println(outputFuture.statusCode.getOrElse(-1))

使用中遇到问题请在 项目 Issues 区 提交反馈。

致谢

最后对 Scala SDK 的作者 Cheerx (谢启荣同学) 表示感谢,同时我们也欢迎更多高校学生或第三方开发者参与到我们的开源项目中来。

【安全公告】Windows 勒索软件病毒风险通告

近期全球爆发了多起较大规模的 Windows 勒索软件病毒攻击事件众多 Windows 系统用户受到影响。

该勒索来自一款名为 “WannaCry” 的软件木马),通过 Windows 系统的 SMB 服务器漏洞进行入侵会导致磁盘文件被病毒加密对用户数据造成严重损失。请可能被漏洞影响的用户仔细阅读本文并做相应的处理。

注意事项

  1. 请检查青云的防火墙规则如果打开了 1351371381394453389 等危险端口建议关闭。
  2.  定期升级微软发布的安全补丁微软已经于 2017 3 14 日发布了 MS17-010安全补丁
  3. 如果必须打开 3389 端口建议仅在必须使用的时候打开其他时间请禁用。推荐您直接使用青云提供的 VNC 来访问此访问方式经过加密保证安全。
  4. 青云的防火墙在默认情况下不会开启这些有风险的端口。所以如果您没有变更过防火墙请放心使用。

参考资料

Microsoft 安全公告 MS17-010 – 严重
WannaCry ransomware used in widespread attacks all over the world
如何看待 5 12 号爆发在各高校的电脑勒索比特币的病毒

QingStor 对象存储推出 FTP 对接工具 qsftpd

qsftpd 是一个将 QingStor 对象存储作为存储后端的 FTP Server,用户通过简单的配置,即可通过 FTP 协议使用对象存储服务。qsftpd 已在 GitHub 开源,更多详情可参见 https://github.com/yunify/qsftpd

下载安装

qsftpd 支持 Linux、macOS 和 Windows 操作系统,最新版本下载链接如下,也可访问 GitHub 项目的 Releases 页面查看和下载历史版本。

使用示例

创建配置文件,如 qsftpd.yaml,并根据需要进行配置,示例配置文件如下。

# 设置 QingStor 对象存储服务
qingstor:
  access_key_id: access_key_id_example
  secret_access_key: secret_access_key_example
  host: qingstor.com
  port: 443
  protocol: https
  log_level: warn

# 填写需要使用的 Bucket
bucket_name: bucket_name_example
zone: pek3a

# FTP Server 配置,如监听的端口号和最大连接数
listen_host: 127.0.0.1
listen_port: 21
public_host: 127.0.0.1
max_connections: 128

# 认证设置,默认允许匿名用户登录,也可以指定特定的用户登录
#users:
#  username_example: password_example

启动 FTP Server。

$ qsftpd -c path/to/your/qsftpd.yaml
[2017-04-12T03:24:40.541Z #2527]  INFO -- : Listening... 127.0.0.1:21
[2017-04-12T03:24:40.541Z #2527]  INFO -- : Starting...
[2017-04-12T03:24:49.330Z #2527]  INFO -- : FTP Client connected: ftp.connected, id: 76e209d6a89448279e947a7babe0097d, RemoteAddr: 127.0.0.1:51788, Total: 1
......

最后使用 ftp 客户端连接 FTP Server 进行测试。

$ ftp -a 127.0.0.1
Connected to 127.0.0.1.
220 Welcome to QSFTP Server
331 User name okay, need password.
230 Password ok, continue
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||6081|)
150 Using transfer connection
d--------- 1 ftp ftp            0  Nov 30 00:00  test-output

226 Closing transfer connection
ftp> put AUTHORS
local: AUTHORS remote: AUTHORS
229 Entering Extended Passive Mode (|||6887|)
150 Using transfer connection
100% |***********************************|   146       91.68 KiB/s    00:00 ETA
226 Closing transfer connection
146 bytes sent in 00:00 (2.19 KiB/s)
ftp> 

控制台回收站支持彻底删除资源

用户主动删除的资源,由系统在回收站中保留 2 小时。这 2 小时内可以随时恢复资源,以避免误删除资源的情况。由于资源没有彻底删除,它们仍然占用一些相关联的配置,例如 DHCP 分配的内网 IP。某些情况下,我们希望这些内网 IP 能够及时释放出来,以便分配到新创建的资源上。为此回收站新增对已删除资源的“彻底删除”操作,用户可以选择一个资源,或批量选择某类型的多个资源彻底删除。

彻底删除资源后,资源将不可恢复。资源所占用的内网 IP 等信息也会释放出来,供其他资源所使用。