微服务架构系列二:密码强度评测的实现与实验

本文是继《微服务架构系列一:关键技术与原理研究》的后续,系列一中论述了微服务研究的背景和意义,主要调研了传统架构的发展以及存在的问题和微服务架构的由来,然后针对微服务架构的设计原则、容器技术、服务发现、通信机制、持续集成等方面进行了分析与研究,并简单讲述了谷歌Kubernetes的相关组件和原理。系列二依据系列一中讲述的相关技术,进行了业务原理分析和建模,然后一步步实现了基于机器学习的密码强度评测服务,搭建相关环境并部署编排服务和进行了相关验证,最后对微服务架构设计进行了总结和展望,并简单概述了后续系列的工作。 基于机器学习的密码强度评测微服务实现

随着互联网技术的迅猛发展和广泛应用,在数据信息日益敏感的当下,网络安全问题也变得日益严峻。加上数字化和网络化在生活中的普及,防止数据遭到未经授权访问变得越来越重要,由于便于理解,使用简单和部署成本低,自从互联网诞生以来,文本密码几乎应用于需要保护我们的数据的每一个地方,尽管它们有许多已知的缺陷[1][2][3]。评测密码强度的方式有很多,除了常规的基于字符种类规则,也有借助猜测熵和最小熵对密码强度进行估计的研究[4],基于模糊概率上下文无关语法的密码强度估计[5]。

机器学习是人工智能领域中最能体现智能的分支,从历史看,机器学习也是人工智能领域发展最快的分支之一[6]。本章节会通过机器学习方法去对密码强弱进行分类,并通过Python把对应算法即K最近邻算法,决策树算法实现成微服务,供上游调用,以组成整体微服务架构中核心业务部分。另外因为机器学习相关算法研究及实现不是本文重点,同时鉴于时间和篇幅,对于朴素贝叶斯、多层感知器、支持向量机等其它适用于密码强度评测的机器学习算法,在本文就不做讨论和相关具体实现了,而且已经有相关研究对其它几种算法进行了可行性论述[7][8],后续可能会通过发起Github上的开源项目去继续研究和探讨。

1. K-最近邻算法

K 最近邻算法 (k-Nearest Neighbor),简称KNN,是一个在理论上比较成熟的算法,也是目前最简单的机器学习算法之一,它是一种惰性学习算法(分类器不需使用训练数据集进行训练,训练的时间复杂度为0,有利有弊,与其它惰性学习算法一样,KNN的计算复杂度会随着训练集的空间大小增大而增大,也就是说分类复杂度为O(n)),是在1968年由 Cover 和Hart 提出的。该算法的思想是:如果一个样本它的特征空间中,有K个最相似也就是最邻近的样本的大多数都属于一个分类,那么这个样本也属于这个分类。当然算法的前提是,所选的K个样本都是经过正确分类过的,一般K是不大于20的整数。一句话概括就是找到离自己最近的K个点中的大多数同一分类的类别作为自己的类别。

距离计算数学描述:

对于任意的特征向量x:

ar(x)表示实例x的第r个属性值,两个实例xixj之间的距离定义为d(xi xj)

根据欧式距离公式:

训练算法:

对于每个训练实例<x,f(x)>,把这个样本加入训练实例列表中

分类算法:

给定一个要分类的查询实例xq ,在训练实例列表中选出最邻近xq的k个实例,并用x1…xk来表示,定义离散目标函数

V是有限集合{v1,v2 ... vs},则

其中如果a=b那么

否则

对前面的K最近邻算法做一下简单修改,使其能被用于逼近连续值的目标函数,为了达到此目标,我们只需要让算法计算K个最临近实例的平均值,而不再是计算其中的最普遍的值,定义实值目标函数

2. 决策树

决策树(Decision Tree),顾名思义,是一种树——依托策略抉择而建立的树。在机器学习里面,它是一个预测模型,它所代表的是一个对象的属性和值之间的映射关系。决策树是应用最广的归纳推理算法之一,属于监督学习中的一种,所谓监督学习,就是给定一定数量的都有属于自己的一些属性以及类别的样本。其中类别是根据数据本身属性确定的,然后,通过对样本数据进行训练学习得到一个分类器,得到的分类器可以对新出现的实例进行分类,这种机器学习方式就被称为监督学习。

我们可以用下面的箭线图1-1来形象的表示决策的过程的各个阶段之间的联系。

图1-1 决策树决策过程关系图 

选择分割的方法可以有很多,但最终目的一致:也就是对目标类尝试进行最佳分割,由于从根到叶子有多条路径,一条规则对应一条路径,很明显,决策树是一颗二叉树或多叉树。

决策树有四种构成要素,决策结点、状态节点、方案枝、概率枝。决策结点也叫方块结点;状态结点又叫圆形结点;决策结点引出若干条分支每条分支代表一个方案,故称方案枝;状态结点又会引出很多分支,代表不同的状态,由于上面会反映客观状态和出现的频率,每个分支又被称为概率枝,在概率枝的末端会有该状态下所达到结果也就是权重值。如图1-2所示。

图1-2 决策树图标示例

决策树分类的思想跟大学报志愿类似,我们会考虑,学校层次是名校、985还是211等,然后地域是南方还是北方、专业是否热门等因素,不同的因素不同的人会有不同的侧重,所谓因人而异,那么就需要具体情况具体分析和决策。如果把每一个未知的选项都归类到已有的分类类别中就形成了一颗决策树。

3. 训练数据准备

训练数据是利用了2014年俄罗斯黑客在网上公布的近500万Gmail邮箱及对应密码,再加上密码强度分类——把这部分密码重新请求谷歌密码强度验证服务https://accounts.google.com/RatePassword得到的与相应密码对应的密码强度数据。技术上是通过PHP来抓取的,因为模拟请求比较简单,主要是用Curl伪造User-Agent等相关Header,借助于multi_exec,并发100,速度还是比较快的,不到一天就抓完了。需要注意的是谷歌服务器对IP访问有一定的限制,所以这部分操作是事先在网络上寻找免费的代理IP,集合到共享内存,然后用另外一个脚本去取IP并用此IP访问百度,如果HTTP请求在一秒钟返回200,在给当前IP权值加1,一秒钟未返回或返回非200,则减1,加1最大到7,减1最小到-3,一段时间后,就会有一个相对活跃的IP池,供抓取脚本随机选取利用。

之所以抓取谷歌密码强度数据,是因为在调研了包括12306注册,百度账号注册,腾讯QQ注册,阿里的淘宝注册,Microsoft Bing,Facebook账号注册,Google Gmail注册等相对较大的网站后发现,除了Facebook对于非法或简单密码是通过服务端返回比较有意思的"请选择更安全的密码。密码必须多于 6 个字符,并且对你意义独特,使其他人难以猜出。"信息,Google是通过前端返回最短长度提示以及服务端返回弱,一般,较强,强的密码强度提示外,其它网站及应用都是通过纯前端的规则来进行限制和提示,比如字符的长短,数字,大小写,特殊字符的种类多少等。

4. 数据预处理

密码按长度和字符类型划分为五个维度,分别是密码长度,是否含有数字,是否含有大写字母,是否含有小写字母,是否含有特殊字符。程序简单实现如图1-3所示。

图1-3 数据预处理python主要代码

5. 算法实现

5.1 K最近邻算法密码评测

对未知密码强度密码实施KNN分类算法伪代码如下:

1)计算已知密码强度数据计算密码强度向量与当前密码向量之间的距离

2)对上一步计算结果按照距离递减排序

3)选出与当前密码向量距离最小的Top K个密码向量,K为20

4)确定Top K个向量所在类别占数据集或抽样数据集密码强度的比例

5)返回Top K个向量比例最高的密码强度为当前密码向量密码强度

经过数据打散,抽样,并按等同比例获取四种密码强度数据,用Matplotlib画散点图如图1-4所示,从图中密码强度分布中,大致可以看出符号种类越多越强,密码位数越多越强的规律。

图1-4 KNN数据建模呈现图

5.2 决策树算法密码强度评测

对未知密码强度密码实施决策树分类算法伪代码如下:

1)创建唯一的影响密码强度分类的因素列表

2)计算每种划分方式下密码强度数据的香农熵

3)找出最好的信息增益计算方式

4)因为特征值有多个,一次划分后可以再次划分数据,需要递归划分数据

5)存储训练数据得到的树,并能够解析决策树,以供新密码向量遍历

6)比较当前密码向量的与树节点的值,如果到达叶子节点,返回这个叶子节点的密码强度分类。

经过数据打散,抽样,并按等同比例获取四种密码强度数据,通过上述算法实现后得到如下决策树:

{'密码字符种类': {1: {'密码长度': {8: 弱, 9: 一般, : 一般, 11: 一般, 12: 弱, 13: 弱, 14: 一般, 15: 弱, 16: 一般}}, 2: {'密码长度': {8: 弱    , 9: 弱, : 一般, 11: 较强, 12: 一般, 13: 一般, 14: 一般, 15: 强, 16: 一般}}, 3: {'密码长度': {8: 一般, 9: 较强, : 较强, 11: 强, 12: 较强,     13: 强, 14: 强, 15: 强, 16: 强}}, 4: {'密码长度': {8: 强, 9: 较强, : 强, 11: 较强, 12: 强, 13: 强, 14: 强, 15: 强, 16: 强}}}

用Matplotlib展示如图1-5所示(其中叶结点的阿拉伯数字1,2,3,4分别代表密码强度弱,一般,较强强)。通过决策树我们更能清晰地观察到,密码强度与密码种类强相关,密码种类越多,相同密码位数的密码强度越强。

图1-5密码强度决策树

环境搭建,测试实验

搭建Kubernetes的方式有很多,在研究过程中,经过从最初的在本地虚拟机原生搭建1.6,在阿里云服务器上用Kubeadm搭建1.8,本地虚拟机Kubeadm搭建1.10,本地Vagrant搭建1.11,谷歌云服务器Kubernets Engine直接搭建1.12等实验。发现本地原生搭建是最麻烦的,因为集群搭建过程中需要通过自创建各种证书,一步步的安装各个组件和启动各个节点,较繁琐。谷歌云直接用Kubnernets引擎搭建是最迅捷的,只需要选择需要版本就可以。综合考虑研究部分步骤的必要性及通用性价值,最终选择在阿里云服务器采用Kubeadm搭建,Kubeadm是官方提供的自动化安装工具,自动配置了必要的服务和安全的认证,主要组件都变成Pod而非操作系统进程,这样可以不断检测其状态并且进行相应的容错处理,本章主要内容就是借助Kubeadm搭建高可用Kuberntes集群,并讲述了在部分核心资源不可获取时如何应对[10]。

1. Docker及Docker-Registry搭建

1.1 安装Docker

Docker安装相对Etcd比较简单,可以选择如下三种方式之一:

1)通过配置软件源安装:

官方源:

为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥,命令参考如下: 

代码语言:javascript
复制
curl -fsSL https://download.docker.com/linux/debian/gpg> key.gpgapt-key add key.gpg

然后,我们需要向 source.list 中添加 Docker CE 软件源:   

代码语言:javascript
复制
sudo add-apt-repository \    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \    $(lsb_release -cs) \    stable"

国内源:

代码语言:javascript
复制
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo apt-key add -sudo add-apt-repository \    "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/debian \    $(lsb_release -cs) \    stable"

然后执行更新安装

代码语言:javascript
复制
apt-get updateapt-get install docker-ce

2)脚本安装:

 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本

代码语言:javascript
复制
curl -fsSL get.docker.com -o get-docker.sh sh get-docker.sh --mirror Aliyun

执行此命令后,脚本就会自动将一切准备工作做好,并把 Docker CE 的 Edge 版本安装在系统中。 

3)二进制安装:

下载,解压,复制相关文件到指定目录:

代码语言:javascript
复制
wget https://get.docker.com/builds/Linux/x86_64/docker-17.05.0-ce.tgztar -xvf docker-17.05.0-ce.tgzcp docker/docker* /usr/local/bin/cp docker/completion/bash/docker /etc/bash_completion.d/

配置/etc/systemd/system/docker.service:

代码语言:javascript
复制
[Unit]    Description=Docker Application Container Engine    Documentation=http://docs.docker.io    [Service]    Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"    EnvironmentFile=-/run/flannel/docker    ExecStart=/usr/bin/dockerd --log-level=error $DOCKER_NETWORK_OPTIONS    ExecReload=/bin/kill -s HUP $MAINPID    Restart=on-failure    RestartSec=5    LimitNOFILE=infinity    LimitNPROC=infinity    LimitCORE=infinity    Delegate=yes    KillMode=process    [Install]    WantedBy=multi-user.target

启动:

代码语言:javascript
复制
systemctl enable dockersystemctl start docker

1.2 Docker-Registry搭建

有了Docker,搭建Docker-Registry就更简单了,借助于Registry镜像,可以用如下命令一键搭建:

代码语言:javascript
复制
docker run -d \-p 5000:5000 \-v /opt/registry/data:/var/lib/registry \--restart=always \--name registry \registry

除此外可以利用Nginx作为反向代理打造私有registry,还可以顺带定制化域名访问,比如localtest.registry..com:9000,如下就是nginx反向代理做的简单登录认证相关命令及配置:

代码语言:javascript
复制
htpasswd -c /etc/nginx/docker-registry.passwd passwordserver {   listen 9000;   auth_basic "Dokcer-registryAccess";   auth_basic_user_file /etc/nginx/dokcer-registry.passwd;   location / {       proxy_pass http://ip:5000;   }}

当然除此外如果需要外网访问并对安全有更高要求,依然可以通过Nginx添加SSL证书,开启相关配置使用HTTPS方式请求。

这里需要注意的是,搭建好Kubernetes后需要添加本地指定的Docker-registry,使用如下命令,不然默认是连接docker.hub。

代码语言:javascript
复制
kubectl create secret docker-registry--docker-server=localtest.registry.com:9000--docker-username=username--docker-password=password--docker-email=username@xxmail.com

2. Etcd集群搭建

前面已经提到了Etcd的原理和用途,在这里Ectd作为Kubernetes集群中非常重要的组件,用以存储集群中所有的网络配置及相关对象的状态信息。

2.1二进制模式安装

下载二进制文件,解压,然后拷贝到指定目录,命令参考如图2-1。

图2-1 Etcd二进制下载相关命令

分别在三个服务器节点按图2-2所示命令进行配置。

图2-2 Etcd二进制安装命令

上述配置,name是节点名称,initial-advertise-peer-urls是集群其他节点地址,listen-peer-urls是用于与其他节点通讯的监听地址,advertise-client-urls是知客户端地址,initial-cluster-token 是集群的ID,initial-cluster是集群中所有节点,initial-cluster-state是集群状态是初始化还是已存在。除此外还有很多参数,比较重要的比如data-dir 指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件等。再就是可以通过安全相关参数即ca-file,cert-file,key-file配置TLS模式,实现更安全的模式。

集群建立后,可以通过curl http://10.0.30.101:2379/v2/members或etcdctl命令查看集群信息,具体如图2-3所示。

图2-3 Etcd集群状态信息

2.2 Docker模式搭建

Docker方式跟二进制方式大同小异,只是每个ectd节点运行在一个docker容器中,具体命令如图2-4所示。

图2-4 Docker搭建Etcd命令(1)

图2-4 Docker搭建Etcd命令(2)

3. Kubernetes集群搭建

3.1 安装Kubeadm、Kubelet、Kubectl

网络正常及有正常可用apt源的时候很简单,就是简单的如下更新安装:apt-get update&&apt-get install Kubeadm Kubelet Kubectl,这里额外介绍一种在研究初期无安装源及无可用命令行访问外国网站配置时的方式。

1)访问外国网站下载packages索引

代码语言:javascript
复制
https://packages.cloud.google.com/apt/dists/Kubernetes-xenial/main/binary-amd64/Packages

这里选择1.8版本,具体索引如下:

2)根据Filename下载对应的deb

代码语言:javascript
复制
https://packages.cloud.google.com/apt/pool/Kubeadm_1.8.0-00_amd64_22842ddc6d1ffabc04718f384ac001ffa56324cc61e6c3a7c991337bf3e39e06.debhttps://packages.cloud.google.com/apt/pool/Kubectl_1.8.0-00_amd64_9bd409d2a0300d4b550cd2a7fd2eca6437ea0767805f6fd807912b245ec949ed.debhttps://packages.cloud.google.com/apt/pool/Kubelet_1.8.0-00_amd64_00b7c77c924d654c7def52c83cfeb9a3d1836c1e7b40683c3fe8207b0bd299d1.deb

3)构建本地软件源并更新安装

代码语言:javascript
复制
dpkg-scanpackages ./| gzip - > ./Packages.gzapt-get updateapt-get install Kubeadmapt-get install Kubeletapt-get install Kubectl

4)配置kubeadm init 的配置文件

由于在新版本中,kubeadm init已经废弃了--external-etcd-endpoints参数,所以要引用外部高可用Etcd集群,我们需要手动为Kubeadm创建yaml配置文件kube-config.yaml,然后执行kubeadm init --config=kube-config.yaml,Ectd相关配置如图2-5所示:

图2-5 Kubeadm初始化时Kube-config.yaml配置文件

3.2 Kubeadm初始化

1)准备相关镜像

因为Kubeadm在初始化集群时候拉取gcr.io中的镜像也要求能够访问外国网站,虽然目前已经有一些网站提供相关镜像,但为了更快速尤其是用到指定版本或最新版本,这里借助于dockerhub的Configure Automated Builds,依据Github的Dockerfile转存谷歌容器仓库(gcr.io)的镜像,转存命令很简单,以调度器为例:

FROM gcr.io/google_containers/kube-scheduler-amd64:v1.6.0,具体Dockerhub配置如图2-6所示。

图2-6 Dockerhub 配置Github自动构建图

之后通过命令拉取下来重新打一下标签就行:

代码语言:javascript
复制
docker pull raysail/kube-scheduler-amd64:v1.8.0dockertag raysail/kube-scheduler-amd64:v1.8.0gcr.io/google_containers/kube-scheduler-amd64:v1.8.0

需要转存的镜像镜像列表如下:

代码语言:javascript
复制
gcr.io/google_containers/kube-scheduler-amd64:v1.8.0gcr.io/google_containers/kube-apiServer-amd64:v1.8.0gcr.io/google_containers/kube-controller-manager-amd64:v1.8.0gcr.io/google_containers/kube-proxy-amd64:v1.8.0gcr.io/google_containers/k8s-dns-Kube-dns-amd64:1.14.5gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.5gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.5

不同版本对应相关镜像不一样,具体可以参照生成的相关Manifests或者打印出的日志以及初始化时的日志或通过Kubectl logs查看对应的pod日志。

另外,为了使Flannel正常工作,Kubernetes官方文档指出,在Kubeadm init 时候必须要追加--pod-network-cidr=10.244.0.0/16参数[10]。因为上面在引入外部高可用Etcd集群时已经采用了Kubeadm的配置文件方式,且Flannel的CIDR配置参数不能用--config同时存在,所以需要在Kube-config.yaml文件中增加如下两行配置:

代码语言:javascript
复制
networking:  podSubnet: 10.244.0.0/16

Kubeadm初始化成功后,可以用命令检查组件状态

kubectl get componentstatuses,执行结果如图2-7所示。

图2-7 Kubernetes集群初始化后组件健康信息

3.3安装Flannel

因为已经安装了Kubectl,Flannel可以直接用Kubernetes的形式安装,命令如下:

代码语言:javascript
复制
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.0/Documentation/kube-flannel.yml

需要注意的是跟如上镜像一样,到https://hub.docker.com的Configure Automated Builds中转存一下quay.io/coreos/flannel:v0.9.0-amd64。

3.4 加入Nodes

Kubeadm初始化后会生成一个token,用此token通过命令:kubeadm join --token 86d22a.123582ce916b31fc 10.0.30.104:6443加入节点,分别在Master之外的两台机器执行上述命令后,Kubelet会分别在两台Node上启动Flannel和Kube-proxy,如图2-8所示。

图2-8 Kuberntes集群搭建完成pod示例图

4. 密码评测微服务搭建部署

4.1 构建服务镜像

因为两个基于机器学习的密码强度评测算法都是用Python实现的,而其中因为涉及到很多数组或矩阵的运算,所以需要Python的NumPy(Numerical Python)库的支持,NumPy是Python 的一个扩展程序库,支持高维数组和矩阵运算,除此外也对数组运算提供大量的数学函数库。安装Numpy的方式有很多,可以用Pip或Apt-get 等进行安装,因为除了这个库还有一些依赖库,比如Matplotlib等,这里我们使用数据分析较常用的Anaconda这个支持 Linux, Windows 和 Mac 系统,用于大规模数据处理,预测分析和科学计算并致力于简化包的管理和部署的Python免费发行版。

Anaconda的安装比较简单,这里就不做赘述,为了方便直接使用Dockerhub上比较受欢迎的continuumio/anaconda镜像作为基础镜像构建我们的微服务镜像,Dockerfile如图2-9和图2-10所示。

图2-9 基于K最近邻密码强度评测Dockerfile

构建镜像:docker build -t localtest.registry..com:9000/knnpassord:v1 .

运行测试:docker run -d -p 6666:6666 raysail/knnpassord:v1

提交仓库:docker push localtest.registry.com:9000/knnpassord:v1

图2-10 基于决策树密码强度评测Dockerfile

构建镜像:docker build -t localtest.registry..com:9000/dtpassord:v1 .

运行测试:docker run -d -p8888:6666 raysail/dtpassord:v1

提交仓库:docker push localtest.registry.com:9000/dtpassord:v1

4.2 Kubnerntes中运行为服务

分别创建副本数为3的knn-password Deployment ,descisiontree-password Depoyment ,如图2-11和图2-12,并分别创建两个service如图2-13和图2-14:

图2-11 基于KNN的密码强度评测微服务Deployment

图2-12 基于决策树的密码强度评测微服务Deployment

图2-13 基于KNN的密码强度评测微服务Service

图2-14 基于决策树的密码强度评测微服务Service 

  kubnerntes资源查看如图2-15。

图2-15 密码评测微服务创建后kubnertes pod和service视图

用kubectl describe 命令查看服务可以看到每个服务后端挂载有三个pod,以实现容灾和负载均衡,具体如图2-16所示。

图2-16 kubectl describe命令查看服务视图

4.3 验证服务可用性及准确性

两个密码强度评测微服务的protobuf定义如图2-17和图2-18所示。

图2-17 K最近邻密码强度评测Protobuf定义

图2-18 决策树密码强度评测Protobuf定义 

分别用golang和php的客户端测试基于Knn的密码强度评测微服务和基于决策树的密码强度评测微服务可以正常返回。用如下命令分别生成golang客户端桩函数和php客户端桩函数:

代码语言:javascript
复制
protoc --go_out=plugins=grpc:./ ./password.protoprotoc  --php_out=./ --plugin=protoc-gen-grpc=/usr/local/bin/grpc_php_plugin  ./password.proto

5. 持续集成和滚动更新实现

5.1 基于Gitolite的Hook技术

主要算法思想是利用Git的服务端Hook——post-receive来触发Push代码后的操作,也就是提交代码后可以根据分支以及具体的Log中的关键字来相应的执行包括但不限于单元测试,构建镜像,自动部署等操作。

具体可参加如下Shell脚本(处理阶段的自动化脚本处理和Jenkins触发处理注释了,可选择其中一种或别的方式)

代码语言:javascript
复制
#!/bin/bashbranch=""services=("KNNPasswordService" "DTPasswordService")while read oldrev newrev refdo   branch=`echo $ref | cut -d/ -f3`    if [ $branch != "master" ]; then        echo "-----not master, exit post receive shell------"        exit;    fi     echo "-----shell start------"   gitLog=`git log --name-status -1`   for var in ${services[@]};   do         if [[ -n `echo $gitLog |grep $var` ]]; then          sh /home/raysail/Kubeauto/autopublish.sh $var &          #curl -X POST http://10.0.30.202:8900/job/PasswdService/build                       fi   donedone 

5.2 基于Kubeapi的滚动升级

具体主要Shell Code如图2-19所示。

图2-19 Kubeapi主要Shell code 

总结与展望

本文历经近半年,抛开公司内已有组件,尽可能从源头出发,经过阅读相关文献,专著,开源网站及相关技术源码,以及平时工作中的实践演练和相关同学的讨论,理论联系实践,经过业务抽象,最终实现以K近邻算法和决策树算法为算法依据的基于机器学习的密码评测微服务,并把微服务部署到Kubenrnetes集群上及进行了可行性和正确性验证。从微服务的单一职责,自治性,领域驱动设计等设计原则开始,研究了其相关技术栈,包括但不限于容器虚拟化技术,服务发现注册技术,异构系统通信机制,持续集成交付部署等,文中很多组件的原理图都是在基于理论和实践后的原创绘制,对于很多大型的系统架构设计及软件基础架构设计这些都是可以借鉴的资料。

在以上研究基础上,经过学习考试,通过了Google和CNCF(Cloud Native Computing Foundation)联合推出的CKA(Certified Kubernetes Administrator)认证,通过备考的大量实践演练,进一步加深了自动部署、扩展和管理容器化的开源框架Kubernetes原理的认知,也更加相信未来此系统会被大规模采纳并应用到更多的企业和技术领域。 此外在云计算和大数据迅猛发展的今天,机器学习被越来越多的应用到各行各业中,而机器学习应用的工程化,自动化和平台化亟需普及和建设,这也是依托Kubernetes集群进行基于机器学习的微服务实践的原因,当然密码作为一直都很重要的安全行业的重要组成部分,作为本文技术架构下的核心业务部分也是本文的重点工作。

当然本文还有很多优化和后续工作需要做,主要是如下几点。性能方面:借助Golang语言特性重构训练模型,进行计算性能优化;应用Traefik Ingress等K8S负载均衡技术,对外提供服务的同时并提升优化负载能力。业务方面:采用机器学习Tensorflow等库或框架,让平台的机器学习应用多样化,标准化;引入单元测试、集成测试、功能测试、性能测试等多维度测试保证服务可靠性。部署方面:应用支持众多组件及自定义脚本的Jinkens使持续集成可视化;Kubernetes高可用部署,多Master集群,进一步提高容灾能力。监控方面:应用Prometheus相关技术对集群进行进一步日志及状态监控;应用Alertmanger等技术对集群异常进行微信,短信邮件等告警;架构方面:Service Mesh(istio)技术应用,解耦服务的重试、监控、追踪,发现等。除了上述优化和后续工作,对于多服务下的分布式事物和服务治理相关以及熔断、限流、降级等相关问题的应用会在下一期讲述,敬请期待。

参考文献

[1] J. Bonneau, C. Herley, P. van Oorschot, and F. Stajano, “Passwords and the evolution of imperfect authentication,” Commun. of the ACM, vol. 58, no. 7, pp. 78–87, 2015.

[2] J. Yan, A. F. Blackwell, R. J. Anderson, and A. Grant, “Password memorability and security: Empirical results.” IEEE Secur. & priv., vol. 2, no. 5, pp. 25–31, 2004.

[3] W. Cheswick, “Rethinking passwords,” Commun. of the ACM, vol. 56, no. 2, pp. 40–44, 2013.

[4] 严霄凤.基于熵的密码强度估计. 网络安全技术与应用 , 2012(11):36-38

[5] Ding Wang, Debiao He, Haibo Cheng, Ping Wang. fuzzyPSM- A New Password Strength Meter Using Fuzzy Probabilistic Context-Free Grammars. IEEE/IFIP International Conference on Dependable Systems and Networks, 2016 :595-606

[6] 周志华. 机器学习:Machine learning[M]. 清华大学出版社, 2016.

[7] Vijaya M S , Jamuna K S , Karpagavalli S . Password Strength Prediction Using Supervised Machine Learning Techniques[C]// International Conference on Advances in Computing. IEEE, 2010.

[8] G Suganya,S Karpgavalli, V Christina. Proactive Password Strength Analyzer Using Filters and Machine Learning Techniques. International Conference on Advances in Computing , 2010:401-405

[9] (美)米歇尔 (Mitchell T.M.)著,曾华军等译. 计算机科学丛书:机器学习. 北京:机械工业出版社,2003.1,  8:165~177

[10] Kubernetes. Using Kubeadm to Create a Cluster [EB/OL]. https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm, 2017.10