XieJava's blog

记录最好的自己


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

Django的restframework接口框架自定义返回数据格式

发表于 2022-07-14 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.3k | 阅读时长 ≈ 5

在前后端分离是大趋势的背景下,前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发常用的web框架,用Django框架进行web应用框架减少了很多工作,通常用很少量的代码就可以实现数据的增、删、改、查的业务应用,同样用Django的restframework的框架对外发布接口也是非常的简单方便,几行代码就可以将数据对象通过接口的方式提供服务。因为在实际开发过程中接口的返回数据有一定的格式,本文介绍通过自定义Response返回对象来自定义接口返回数据格式。

以下示例将数据对象Friend通过restframework框架进行接口发布。
只要定义Friend数据对象

1
2
3
4
5
6
7
8
9
10
11
12
class Friend(BaseModel):
id=models.AutoField(primary_key=True)
siteName=models.CharField(max_length=20, verbose_name='友链站点名称')
path=models.CharField(max_length=100, verbose_name='地址路径')
desc=models.CharField(max_length=200, verbose_name='描述')

def __str__(self):
return self.siteName

class Meta:
verbose_name='友链'
verbose_name_plural='友链'

定义一个序列化类将返回的字段序列化

1
2
3
4
class FriendModelSerializer(serializers.ModelSerializer):
class Meta:
model = Friend
fields = "__all__"

定义一个接口视图类获取数据

1
2
3
class FriendView(viewsets.ModelViewSet):
queryset = Friend.objects.all()
serializer_class = FriendModelSerializer

定义接口路由就可以通过httprestfull的接口进行访问了

1
2
3
4
friend_list=views.FriendView.as_view({'get':'list',})
urlpatterns = [
path('friend/',friend_list),
]

接口访问效果如下:
http://localhost:8000/api/friend/
httprestfull的接口

但是在项目中经常会碰到接口格式变化的情况,restframework框架默认的返回数据格式不满足应用的需求。比如一般的接口都会有接口返回的code、msg、data,code用来标识接口返回代码比如200是正常,msg用来记录异常或其信息,data用来返回具体的数据。
通过restframework接口自定义返回数据格式也是很简单方便的。
先自定义Response返回对象,在返回对象中自定义数据返回的格式,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from rest_framework.response import Response
from rest_framework.serializers import Serializer

class CustomResponse(Response):
def __init__(self,data=None,code=None,msg=None,
status=None,
template_name=None, headers=None,
exception=False, content_type=None,**kwargs):
super().__init__(None, status=status)

if isinstance(data, Serializer):
msg = (
'You passed a Serializer instance as data, but '
'probably meant to pass serialized `.data` or '
'`.error`. representation.'
)
raise AssertionError(msg)
#自定义返回格式
self.data={'code':code,'msg':msg,'data':data}
self.data.update(kwargs)
self.template_name=template_name
self.exception=exception
self.content_type=content_type

if headers:
for name, value in headers.items():
self[name] = value

在接口接口视图类获取数据返回时,使用该自定义的Response返回对象。

1
2
3
4
5
6
7
8
class FriendView(viewsets.ModelViewSet):
queryset = Friend.objects.all()
serializer_class = FriendModelSerializer
#自定义list方法,自定义Response返回
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, many=True)
return CustomResponse(data=serializer.data, code=200, msg="OK", status=status.HTTP_200_OK)

接口访问效果如下:
可以看到返回数据格式中增加了code,msg 数据放到了data节点
自定义数据返回格式

列表数据通常接口要提供翻页功能,在接口中要有总页数、当前页、是否有下一页的信息。
可以自定义一个分页器,在分页器中自定义需要返回的分页参数
参考示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from common.customresponse import CustomResponse

class MyPage(PageNumberPagination):
page_size = 8 #每页显示数量
max_page_size = 50 #每页最大显示数量。
page_size_query_param = 'size' #每页数量的参数名称
page_query_param = 'page' #页码的参数名称

def get_paginated_response(self, data):
#自定义分页器的返回参数
return CustomResponse(data=data,code=200,msg="OK",status=status.HTTP_200_OK, count=self.page.paginator.count,next=self.get_next_link(),previous=self.get_previous_link(),size=self.page_size,page=self.page.number)

在接口接口视图类获取数据返回时,如果有分页器则使用该分页器自定义的Response返回对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class FriendView(viewsets.ModelViewSet):
queryset = Friend.objects.all()
serializer_class = FriendModelSerializer
pagination_class = MyPage
#自定义list方法,自定义Response返回
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
#如果有分页器,则进行分页后返回
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
return CustomResponse(data=serializer.data, code=200, msg="OK", status=status.HTTP_200_OK)

接口访问效果如下:
可以看到接口中自定义增加了分页信息。
接口中自定义增加了分页信息

但是有时候可能希望分页的信息数据要放在data节点里面,这样也是可以做到的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from common.customresponse import CustomResponse

class MyPage(PageNumberPagination):
page_size = 8 #每页显示数量
max_page_size = 50 #每页最大显示数量。
page_size_query_param = 'size' #每页数量的参数名称
page_query_param = 'page' #页码的参数名称

#自定义分页器的返回参数
def get_paginated_response(self, data):
ret_data = dict()
ret_data['items'] = data
# 加入自定义分页信息
ret_data['total'] = self.page.paginator.count
ret_data['hasNextPage'] = self.get_next_link()
ret_data['size'] = self.page_size
ret_data['page'] = self.page.number
return CustomResponse(data=ret_data,code=200,msg="OK",status=status.HTTP_200_OK)

接口访问效果如下:
可以看到接口中自定义增加了分页信息,分页的信息数据放在data节点里面了
自定义增加了分页信息,分页的信息数据放在data节点里面
至此,本文介绍了通过Django的restframework接口框架自定义Response返回对象来自定义返回数据格式。Django的restframework接口框架使用简单方便,拿来即用,能够很大程度上减少代码开发量。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

Vue3引入vue-router路由并通过vue-wechat-title设置页面title

发表于 2022-07-03 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.7k | 阅读时长 ≈ 7

对于用类似Vue前后端分离技术架构的单页应用页面之间的跳转没有非前后端分离那么来得直接,甚至连设置跳转页面的Title都要费一番周折,本文介绍Vue3引入vue-router路由并设置页面Title,通过vue-router实现页面的路由,通过vue-wechat-title来设置页面的title。

一、用vue-router库实现路由管理

vue-router是Vue.js官方推荐的路由管理库。它和Vue.js的核心深度集成,让构建单页应用变得轻松容易。使用Vue.js和vue-router库创建单页应用非常的简单:使用Vue.js开发,整个应用已经被拆分成了独立的组件;使用vue-router库,可以把路由映射到各个组件,并把各个组件渲染到正确的地方。下面就来介绍如何安装引入vue-router库并实现路由管理

1、安装vue-router库

使用如下命令安装vue-router库

1
npm install -save -vue-router

也可以通过 npm install -save vue-router@4 来指定版本号@4表示版本是4
安装成功后,可以在控制台看到了安装成功的信息和版本号
控制台看到了安装成功的信息和版本号
除此之外也可以在工程中的package.json中看到依赖的库中包含有vue-router及版本号。
package.json中看到依赖的库中包含有vue-router及版本号

2、在router文件夹下创建router.js

在工程的src目录下建立router文件夹 在router文件夹下创建router.js,该文件是Vue路由管理的核心文件,所有的各组件的路由在该文件中进行配置。
参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import { createRouter,createWebHistory } from "vue-router"; //引入vue-router组件
import HelloWorld from '@/components/HelloWorld'; //引入需要路由管理的页面组件HelloWorld
import siteLogin from '@/views/user/login'; //引入需要路由管理的页面组件login
import userInfo from "@/views/user/userinfo"; //引入需要路由管理的页面组件userinfo
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/', //路由的路径
name:'Home', //路由的名称
component:HelloWorld, //路由的组件
},
{
path:'/login',
name:'Login',
component:siteLogin,
},
{
path:'/userinfo',
name:'UserInfo',
component:userInfo,
}
]
})
export default router;

代码组织结构如下:
代码组织结构如下

3、在App.vue中加入路由视图

在App.vue中加入<router-view />
App.vue示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
export default {
name: 'App',
}
</script>
<style>
</style>

4、在项目的main.js中引入路由

参考代码如下:

1
2
3
4
import { createApp } from 'vue';
import App from './App.vue';
import router from "@/router/router"; //引入路由,会去找router下的router.js的配置文件
createApp(App).use(router).mount('#app') //创建应用的时候应用路由

5、验证效果

为了显示更清楚,将默认创建的src\components\HelloWorld.vue内容稍加调整

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<div >
第一个路由组件Home
<p>{{ name }}</p>
</div>
</template>

<script>
export default {
name: 'HelloWorld',
data() {
return {
name:"Hello World!"
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

如果上面的步骤没有遗漏,在终端输入 npm run serve 将前端服务启动起来,在浏览器访问localhost:8080可以看到如下页面:

localhost:8080

访问localhost:8080/login

访问localhost:8080/login

访问localhost:8080/userinfo

访问localhost:8080/userinfo
可以看到访问不同的URL路由到了不同的Vue页面,上述login.vue和userinfo.vue示例代码没有给出,大家可以自行随便实现。

二、用vue-wechat-title实现页面title的设置

在上面实现了不同页面的路由管理,但是访问不同的URL看到的页面title所有的页面都是一样的,如何设置不同页面不同的页面Title呢?比较方便的做法是用vue-wechat-title来实现。
同样首先要安装vue-wechat-title库

1、安装vue-wechat-title库

使用如下命令安装vue-wechat-title库

1
npm install vue-wechat-title -save

安装完成后在工程中的package.json中看到依赖的库中包含有vue-wechat-title及版本号
package.json中看到依赖的库中包含有vue-wechat-title及版本号

2、在router文件夹下的router.js中增加title的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { createRouter,createWebHistory } from "vue-router"; //引入vue-router组件
import HelloWorld from '@/components/HelloWorld'; //引入需要路由管理的页面组件HelloWorld
import siteLogin from '@/views/user/login'; //引入需要路由管理的页面组件login
import userInfo from "@/views/user/userinfo"; //引入需要路由管理的页面组件userinfo
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/', //路由的路径
name:'Home', //路由的名称
meta:{
title: '首页' //title配置
},
component:HelloWorld, //路由的组件
},
{
path:'/login',
name:'Login',
meta:{
title:'登录'
},
component:siteLogin,
},
{
path:'/userinfo',
name:'UserInfo',
meta:{
title: '用户信息'
},
component:userInfo,
}
]
})
export default router;

主要是在路由配置时设置了meta:{title:'xxxx'}如下图:

router.js中增加title的配置

3、在App.vue页面中使用

App.vue代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<template>
<div id="app" v-wechat-title="$route.meta.title">
<router-view />
</div>
</template>

<script>
export default {
name: 'App',
}
</script>

<style>
</style>

主要是在<div id="app" v-wechat-title="$route.meta.title"> 加入了v-wechat-title="$route.meta.title"

4、在main.js中引用vue-wechat-title

在main.js中引用vue-wechat-title的时候有个坑,如果按照一般的引用会报错
mian.js代码示例如下:

1
2
3
4
5
import { createApp } from 'vue';
import App from './App.vue';
import router from "@/router/router"; //引入路由,会去找router下的router.js的配置文件
import VueWechatTitle from 'vue-wechat-title'; //引入VueWechatTitle
createApp(App).use(router,VueWechatTitle).mount('#app') //创建应用的时候应用路由

在终端输入 npm run serve 将前端服务启动起来会报错!
Uncaught TypeError: Cannot read properties of undefined (reading ‘deep’)

原因是在挂载app示例前,vue-wechat-title还没有加载好,一定要先应用再挂载app
将createApp(App).use(router,VueWechatTitle).mount(‘#app’)删除或注释掉。改用

1
2
3
4
const app=createApp(App);
app.use(VueWechatTitle);
app.use(router);
app.mount('#app')

main.js的参考示例代码如下:

1
2
3
4
5
6
7
8
9
import { createApp } from 'vue';
import App from './App.vue';
import router from "@/router/router"; //引入路由,会去找router下的router.js的配置文件
import VueWechatTitle from 'vue-wechat-title'; //引入VueWechatTitle
//createApp(App).use(router,VueWechatTitle).mount('#app') //指令定义在 mount('#app')之后,导致自定义指令未挂载到,会报错
const app=createApp(App);
app.use(VueWechatTitle);
app.use(router);
app.mount('#app')

5、验证效果

在终端输入 npm run serve 将前端服务启动起来
看到访问不同的URL会显示不同的title
http://localhost:8080/

http://localhost:8080/的title
http://localhost:8080/login

login的title登录

http://localhost:8080/userinfo

userinfo的title用户信息

本文通过以上实例实现了Vue3引入vue-router路由并设置页面Title,通过vue-router实现页面的路由,通过vue-wechat-title来设置页面的title都还比较方便。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

Vue快速入门

发表于 2022-07-03 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2.3k | 阅读时长 ≈ 10

一、什么是Vue

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

二、安装

1、独立版本
直接下载并用<script>标签引入
官网下载地址:https://cn.vuejs.org/js/vue.js
2、使用CDN
和独立版本类似,与独立版本的区别就是不用下载到本地应用,直接引用CDN加速以后的地址。缺点是如果是内网封闭环境不能用,国内CDN也不稳定,国外的CDN有时无法访问。如官网的
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> 就无法访问。
几个比较稳定的CDN
Staticfile CDN(国内) : https://cdn.staticfile.org/vue/2.2.2/vue.min.js
unpkg:https://unpkg.com/vue@2.6.14/dist/vue.min.js。
cdnjs : https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js
3、命令行工具
Vue 提供了一个官方的 CLI,为单页面应用 (SPA) 快速搭建繁杂的脚手架。它为现代前端工作流提供了开箱即用的构建设置。只需要几分钟的时间就可以运行起来并带有热重载、保存时 lint 校验,以及生产环境可用的构建版本。更多详情可查阅 Vue CLI 的文档。

三、第一个Vue

程序员学一门新的语音或框架,都是从hello world!开始的。来看一下Vue的hello world!
将vue.min.js下载到本地,在vue.min.js的目录下新建一个hellovue.html的文件,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<script src="vue.min.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>

<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
</script>
</body>
</html>

用浏览器打开,hello Vue! 成功的展现出来,第一个Vue就这么简单。
hello Vue!

在这里我们通过<script src="vue.min.js"></script>引入了本地的vue.min.js,就可以用vue框架了。
通过<div id="app">构建了一个DOM元素div标签元素,id为app,`{{message}}` 是占位符,类似于大多数的模板语法。

1
2
3
<div id="app">
{{ message }}
</div>

在javascript代码中,定义了一个Vue对象,对象中构造了el和data两个参数。el是元素选择器,通过#app选择了id="app"的div,data用来定义数据属性,这里定义了massage:'hellow Vue!',通过`{{message}}`将数据hellow Vue显示输出。
可以用chrome浏览器的开发者工具打开控制台看到app.message的值为’hellow Vue!’。
chrome浏览器的开发者工具调试

可以通过修改这个变量的值而改变显示在浏览器的值。
修改值

四、常用基本语法

模板语法
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上

插值文本

数据绑定最常见的形式就是使用 `{{xxx}}`(双大括号)的文本插值:
正如我们的第一的Vue通过`{{ message }}`将文本值插入到占位符进行数据绑定

1
2
3
<div id="app">
<p>{{ message }}</p>
</div>

绑定输出html

使用v-html 指令用于输出 html 代码:

1
2
3
4
5
6
7
8
9
10
app2:v-html指令输出html代码
<div id="app2">
<div v-html="message"></div>
</div>
var app2 = new Vue({
el: '#app2',
data: {
message: '<b>Hello Vue!</b>'
}
});

效果如下图所示:
v-html

如果不用v-html插入,将<div id="app2">标签内容改成用文本插入

1
2
3
<div id="app2">
<p>{{ message }}</p>
</div>

显示效果如下,直接将html代码给显示出来了。
直接显示HTML代码

绑定属性

HTML 属性中的值应使用 v-bind 指令。
如插入绑定 a 标签的href属性

1
2
3
4
5
6
7
8
9
10
app3:v-bind指令绑定属性值
<div id="app3">
<a target="_blank" v-bind:href="url">click me go to myblog</a>
</div>
var app3 = new Vue({
el: '#app3',
data: {
url: 'http://xiejava.ishareread.com/'
}
});

效果如下:
绑定属性

绑定样式

class 与 style 是 HTML 元素的属性,用于设置元素的样式,可以用 v-bind 来绑定设置样式属性

1
2
3
4
5
6
7
8
9
10
11
12
app4:v-band:class指令绑定样式
<div id="app4">
<div v-bind:class="{ 'active': isActive }"></div>
</div>
<br>
var app4=new Vue(
{
el: '#app4',
data: {
isActive:true
}
});

定义样式

1
2
3
4
5
6
7
<style>
.active {
width: 100px;
height: 100px;
background: red;
}
</style>

效果如下:
v-band:class

插值Javascript表达式

vue.js插值支持javascript表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
app5:vue.js插值的javascript表达式支持
<div id="app5">
{{5+5}}<br>
{{ ok ? 'YES' : 'NO' }}<br>
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id">xiejava</div>
</div>
<br>
var app5 = new Vue({
el: '#app5',
data: {
ok: true,
message: 'XIEJAVA',
id : 1
}
});

效果如下:

vue.js插值支持javascript表达式

常用语句

v-if v-else (条件语句)

条件判断使用 v-if 指令,可以用 v-else 指令给 v-if 添加一个 “else” 块:

1
2
3
4
5
6
7
8
9
10
11
app6:v-if条件语句
<div id="app6">
<div v-if="ok">YES</div>
<div v-else>NO</div>
</div>
var app6 = new Vue({
el:"#app6",
data:{
ok:false,
}
});

效果如下:

v-if v-else (条件语句)

for循环语句

循环使用 v-for 指令,v-for 可以绑定数据到数组来渲染一个列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div id="app7">
<ol>
<li v-for="code in codes">
{{ code.name }}
</li>
</ol>
</div>
<br>
var app7=new Vue(
{
el: '#app7',
data: {
codes: [
{ name: 'java' },
{ name: 'python' },
{ name: 'php' }
]
}
});

效果如下:
for循环语句

v-on绑定事件

事件监听可以使用 v-on 指令进行绑定

1
2
3
4
5
6
7
8
9
10
11
<div id="app8">
<button v-on:click="counter += 1">+1</button>
<p>加了 {{ counter }} 次1。</p>
</div>
var app8=new Vue(
{
el: '#app8',
data: {
counter:0
}
});

效果如下:

v-on绑定事件

以上全部示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
app1:hello Vue!
<div id="app1">
{{ message }}
</div>
<br>

app2:v-html指令输出html代码
<div id="app2">
<div v-html="message"></div>
</div>
<br>

app3:v-bind指令绑定属性值
<div id="app3">
<a target="_blank" v-bind:href="url">click me go to myblog</a>
</div>
<br>

app4:v-band:class指令绑定样式
<div id="app4">
<div v-bind:class="{ 'active': isActive }"></div>
</div>
<br>

app5:vue.js插值的javascript表达式支持
<div id="app5">
{{5+5}}<br>
{{ ok ? 'YES' : 'NO' }}<br>
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id">xiejava</div>
</div>
<br>

app6:v-if条件语句
<div id="app6">
<div v-if="ok">YES</div>
<div v-else>NO</div>
</div>
<br>

app7:for循环语句
<div id="app7">
<ol>
<li v-for="code in codes">
{{ code.name }}
</li>
</ol>
</div>
<br>

app8:v-on绑定事件
<div id="app8">
<button v-on:click="counter += 1">+1</button>
<p>加了 {{ counter }} 次1。</p>
</div>
<br>

<script type="text/javascript">
var app1 = new Vue({
el: '#app1',
data: {
message: 'Hello Vue!'
}
});

var app2 = new Vue({
el: '#app2',
data: {
message: '<b>Hello Vue!</b>'
}
});

var app3 = new Vue({
el: '#app3',
data: {
url: 'http://xiejava.ishareread.com/'
}
});

var app4=new Vue(
{
el: '#app4',
data: {
isActive:true
}
});

var app5 = new Vue({
el: '#app5',
data: {
ok: true,
message: 'XIEJAVA',
id : 1
}
});

var app6 = new Vue({
el:"#app6",
data:{
ok:false,
}
});

var app7=new Vue(
{
el: '#app7',
data: {
codes: [
{ name: 'java' },
{ name: 'python' },
{ name: 'php' }
]
}
});

var app8=new Vue(
{
el: '#app8',
data: {
counter:0
}
});
</script>
<style>
.active {
width: 100px;
height: 100px;
background: red;
}
</style>
</body>
</html>

通过上面的快速入门,基本了解什么是VUE、VUE的安装及基本的使用,常用的语法。后面还要更深入的学习VUE的组件、路由、后台接口调用等。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

PyCharm在用Django开发时debug模式启动失败显示can't find '__main__' module的解决方法

发表于 2022-06-06 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 203 | 阅读时长 ≈ 1

初次用Django开发web应用,在试图用Pycharm进行debug的时候,出现了一个奇怪的问题。以正常模式启动或者在terminal启动都没有问题。但是以debug模式启动时,显示can't find '__main__' module”报错。在网上找了很久都没有看到解决方法,最后在某乎上看到一篇文章,在启动时加上--noreload参数,既可以debug模式启动。

报错信息:
报错信息
解决方法:
在启动时加上 --noreload 参数可以正常启动调试
加入不重新加载参数

debug启动正常也可以调试了。
debug正常启动

踩过的坑记录一下,希望能帮到碰到同样问题的人。

感谢大佬的文章 https://zhuanlan.zhihu.com/p/443763989


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

Python使用BeautifulSoup4修改网页内容实战

发表于 2022-05-18 | 更新于: 2025-04-08 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.2k | 阅读时长 ≈ 6

最近有个小项目,需要爬取页面上相应的资源数据后,保存到本地,然后将原始的HTML源文件保存下来,对HTML页面的内容进行修改将某些标签整个给替换掉。

对于这类需要对HTML进行操作的需求,最方便的莫过于BeautifulSoup4的库了。

样例的HTML代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<body>
<a class="videoslide" href="http://www.test.com/wp-content/uploads/1020/1381824922.JPG">
<img src="http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG" data-zy-media-id="zy_location_201310151613422786"/>
</a>
<a href="http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG">
<img data-zy-media-id="zy_image_201310151613169945" src="http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG"/></a>
<a href="http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg">
<img data-zy-media-id="zy_image_201310151613163009" src="http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg"/>
</a>
<a href="http://www.test.com/wp-content/uploads/1020/第三张.jpg">
<img data-zy-media-id="zy_image_201312311838584446" src="http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg"/>
</a>
</body>
</html>

这里主要包括了<a >标签,<a >标签里面嵌入了<img >标签,其中有<a class="videoslide">的标识该标签实际是可以播放动画的。需要根据class="videoslide" 来判断将整个<a >标签换成播放器的<video >标签,将没有class="videoslide" 的<a >标签换成<figure>标签。

也就是将带有的<a class="videoslide" ...><img ... /></a>标签换成

1
2
3
4
5
6
<div class="video">
<video controls width="100%" poster="视频链接的图片地址.jpg">
<source src="视频文件的静态地址.mp4" type="video/mp4" />
您的浏览器不支持H5视频,请使用Chrome/Firefox/Edge浏览器。
</video>
</div>

将<a ....><img .../></a>标签换成

1
2
3
4
<figure>
< img src="图片地址_compressed.jpg" data-zy-media-id="图片地址.jpg">
<figcaption>文字说明(如果有)</figcaption>
</figure>

这里通过BeautifulSoup4 的select()方法找到标签,通过get()方法获取标签及标签属性值,通过replaceWith来替换标签,具体代码如下:
首先安装BeautifulSoup4的库,BeautifulSoup4库依赖于lxml库,所以也需要安装lxml库。

1
2
pip install bs4
pip install lxml

具体代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import os
from bs4 import BeautifulSoup
htmlstr='<html><body>' \
'<a class="videoslide" href="http://www.test.com/wp-content/uploads/1020/1381824922.JPG">' \
'<img src="http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG" data-zy-media-id="zy_location_201310151613422786"/></a>' \
'<a href="http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG">' \
'<img data-zy-media-id="zy_image_201310151613169945" src="http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG"/></a>' \
'<a href="http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg">' \
'<img data-zy-media-id="zy_image_201310151613163009" src="http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg"/></a>' \
'<a href="http://www.test.com/wp-content/uploads/1020/第三张.jpg">' \
'<img data-zy-media-id="zy_image_201312311838584446" src="http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg"/></a>' \
'</body></html>'

def procHtml(htmlstr):
soup = BeautifulSoup(htmlstr, 'lxml')
a_tags=soup.select('a')
for a_tag in a_tags:
a_tag_src = a_tag.get('href')
a_tag_filename = os.path.basename(a_tag_src)
a_tag_path = os.path.join('src', a_tag_filename)
a_tag['href']=a_tag_path
next_tag=a_tag.next
#判断是视频还是图片,如果a标签带了class="videoslide" 是视频否则是图片
if a_tag.get('class') and 'videoslide'==a_tag.get('class')[0]:
# 处理视频文件
media_id = next_tag.get('data-zy-media-id')
if media_id:
media_url = 'http://www.test.com/travel/show_media/' + str(media_id)+'.mp4'
media_filename = os.path.basename(media_url)
media_path = os.path.join('src', media_filename)
# 将div.video标签替换a标签
video_html = '<div class=\"video\"><video controls width = \"100%\" poster = \"' + a_tag_path + '\" ><source src = \"' + media_path + '\" type = \"video/mp4\" /> 您的浏览器不支持H5视频,请使用Chrome / Firefox / Edge浏览器。 </video></div>'
video_soup = BeautifulSoup(video_html, 'lxml')
a_tag.replaceWith(video_soup.div)
else:
#获取图片信息
if 'img'==next_tag.name:
img_src=next_tag.get('src')
# 判断是否路径是否为本地资源 data:image和file:
if img_src.find('data:image') == -1 and img_src.find('file:') == -1:
img_filename = os.path.basename(img_src)
img_path = os.path.join('src', img_filename)
# 将<figure><img>标签替换a标签
figcaption=''
figure_html='<figure><img src=\"'+img_path+'\" data-zy-media-id=\"'+a_tag_path+'\"><figcaption>'+figcaption+'</figcaption></figure>'
figure_soup = BeautifulSoup(figure_html, 'lxml')
a_tag.replaceWith(figure_soup.figure)
html_content = soup.contents[0]
return html_content

if __name__ == '__main__':
pro_html_str=procHtml(htmlstr)
print(pro_html_str)

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<body>
<div class="video">
<video controls="" poster="src\1381824922.JPG" width="100%">
<source src="src\zy_location_201310151613422786.mp4" type="video/mp4"/> 您的浏览器不支持H5视频,请使用Chrome / Firefox / Edge浏览器。
</video>
</div>
<figure>
<img data-zy-media-id="src\第一张_1381824798.JPG" src="src\第一张_1381824798_zy_compress.JPG"/>
<figcaption></figcaption>
</figure>
<figure>
<img data-zy-media-id="src\第二张_1381824796.jpg" src="src\第二张_1381824796_zy_compress.jpg"/>
<figcaption></figcaption></figure>
<figure>
<img data-zy-media-id="src\第三张.jpg" src="src\第三张_zy_compress.jpg"/>
<figcaption></figcaption>
</figure>
</body>
</html>

博客地址:http://xiejava.ishareread.com/

网络安全设备-认识运维安全管理与审计系统(堡垒机)

发表于 2022-05-11 | 更新于: 2025-04-08 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.9k | 阅读时长 ≈ 10

一、什么是运维安全管理与审计系统

运维安全管理与审计系统(俗称 “堡垒机”):是采用新一代智能运维技术框架,基于认证、授权、访问、审计的管理流程设计理念,实现对企事业IT中心的网络设备、数据库、安全设备、主机系统、中间件等资源统一运维管理和审计;通过集中化运维管控、运维过程实时监管、运维访问合规性控制、运维过程图形化审计等功能,为企事业IT中心运维构建一套事前预防、事中监控、事后审计完善的安全管理体系。

简单的说,运维安全管理与审计系统(堡垒机)就是用来控制哪些人可以登录哪些资产(事先防范和控制),以及录像记录登录资产后做了什么事情(事中监控和事后溯源)的系统。其核心是可控及审计。可控是指权限可控、行为可控。权限可控指可以方便的设置、回收运维操作人员的权限;行为可控,比如需要集中禁用某个危险命令;可审计,指有权限操作的人员对资产的所有操作都有记录,能够被监控和审计。

二、为什么需要运维安全管理与审计系统

当企业的IT资产越来越多,当参与运维的岗位越来越多样性,运维团队达到一定的规模,不同的人员如运维人员、开发人员、第三方代维、厂商支撑人员需要控制访问不同的资产及权限,如果没有一套好的机制,就会产生混乱。无法有效的做到“哪些人允许以什么样的身份访问哪些设备”,更加没有办法知道“哪些人登录设备后做了哪些事情”,出了问题以后无法回溯。

运维混乱

运维安全管理与审计系统(堡垒机)是从跳板机(也叫前置机)的概念演变过来的。早在2000年左右,一些中大型企业为了能对运维人员的远程登录进行集中管理,会在机房部署一台跳板机。跳板机其实就是一台unix/linux/windows操作系统的服务器,所有运维人员都需要先远程登录跳板机,然后再从跳板机登录其他服务器中进行运维操作。

跳板机

跳板机解决了远程登录集中管理访问的问题,但跳板机并没有实现对运维人员操作行为的控制和审计,使用跳板机过程中还是会有误操作、违规操作导致的操作事故,一旦出现操作事故很难快速定位原因和责任人。此外,跳板机存在严重的安全风险,一旦跳板机系统被攻入,则将后端资源风险完全暴露无遗。同时,对于个别资源(如telnet)可以通过跳板机来完成一定的内控,但是对于更多更特殊的资源(ftp、rdp等)来讲就显得力不从心了。

人们逐渐认识到跳板机的不足,进而需要更新、更好的安全技术理念来实现运维操作管理。需要一种能满足角色管理与授权审批、信息资源访问控制、操作记录和审计、系统变更和维护控制要求,并生成一些统计报表配合管理规范来不断提升IT内控的合规性的产品。在这些理念的指导下,2005年前后,运维安全管理与审计系统(堡垒机)开始以一个独立的产品形态被广泛部署,有效地降低了运维操作风险,使得运维操作管理变得更简单、更安全。

堡垒机

运维安全管理与审计系统(堡垒机)承担了运维人员在运维过程中唯一的入口,通过精细化授权以明确“哪些人以什么身份访问了哪些设备”,从而让运维混乱变得有序起来,堡垒机不仅可以明确每一个运维人员的访问路径,还可以将每一次访问及操作过程变得可以“审计”,就像飞机中的黑匣子,汽车上的行车记录仪,能够做到针对运维人员的每次一操作均可以录像、全程审计,一但出了问题,可以追踪溯源。

运维安全管理与审计系统的目标可以概括为5W,主要是为了降低运维风险。具体如下:

  • 审计:你做了什么?(What)
  • 授权:你能做哪些?(Which)
  • 账号:你要去哪?(Where)
  • 认证:你是谁?(Who)
  • 来源:访问时间?(When)

运维安全管理与审计系统实现:

  • 事前预防:建立“自然人-资源-资源账号”关系,实现统一认证和授权
  • 事中控制:建立“自然人-操作-资源”关系,实现操作审计和控制
  • 事后审计:建立“自然人-资源-审计日志”关系,实现事后溯源和责任界定

三、运维安全管理与审计系统原理

原理

运维安全管理与审计系统(堡垒机),主要采用4A管理模型,对IT运维操作进行访问控制和行为审计的合规性管控系统,主要用来解决企业IT运维部门账号管理混乱,身份冒用、滥用,授权控制不明确,操作行为不规范,事件责任无法定位等问题。
4A 是指认证 Authentication、授权 Authorization、账号 Account、审计 Audit,中文名称为统一安全管理平台解决方案。即将身份认证、授权、记账和审计定义为网络安全的四大组成部分,从而确立了身份认证在整个网络安全系统中的地位与作用。
具体来说:

  • 集中认证 (authentication) 管理
    可以根据用户应用的实际需要,为用户提供不同强度的认证方式,既可以保持原有的静态口令方式,又可以提供具有双因子认证方式的高强度认证(一次性口令、数字证书、动态口令),而且还能够集成现有其它如生物特征等新型的认证方式。不仅可以实现用户认证的统一管理,并且能够为用户提供统一的认证门户,实现企业信息资源访问的单点登录。
  • 集中权限 (authorization) 管理
    可以对用户的资源访问权限进行集中控制。它既可以实现对 B/S、C/S 应用系统资源的访问权限控制,也可以实现对数据库、主机及网络设备的操作的权限控制,资源控制类型既包括 B/S 的 URL、C/S 的功能模块,也包括数据库的数据、记录及主机、网络设备的操作命令、IP 地址及端口。
  • 集中帐号(account)管理
    为用户提供统一集中的帐号管理,支持管理的资源包括主流的操作系统、网络设备和应用系统;不仅能够实现被管理资源帐号的创建、删除及同步等帐号管理生命周期所包含的基本功能,而且也可以通过平台进行帐号密码策略,密码强度、生存周期的设定。
  • 集中审计 (audit) 管理
    将用户所有的操作日志集中记录管理和分析,不仅可以对用户行为进行监控,并且可以通过集中的审计数据进行数据挖掘,以便于事后的安全事故责任的认定。

技术架构

实现的技术架构如下:
堡垒机技术架构

核心功能

主要核心功能包括:
1、访问控制
通过对访问资源的严格控制,堡垒机可以确保运维人员在其账号有效权限、期限内合法访问操作资源,降低操作风险,以实现安全监管目的,保障运维操作人员的安全、合法合规、可控制性。
2、账号管理
当运维人员在使用堡垒机时,无论是使用云主机还是局域网的主机,都可以同步导入堡垒机进行账号集中管理与密码的批量修改,并可一键批量设置SSH秘钥对等。
3、资源授权
支持云主机、局域网主机等多种形式的主机资源授权,并且堡垒机采用基于角色的访问控制模型,能够对用户、资源、功能作用进行细致化的授权管理,解决人员众多、权限交叉、资产繁琐、各类权限复制等众多运维人员遇到的运维难题。
4、指令审核
对运维人员的账号使用情况,包括登录、资源访问、资源使用等。针对敏感指令,堡垒机可以对非法操作进行阻断响应或触发审核的操作情况,审核未通过的敏感指令,堡垒机将进行拦截。
5、审计录像
除了可以提供安全层面外,还可以利用堡垒机的事前权限授权、事中敏感指令拦截外,以及堡垒机事后运维审计的特性。运维人员在堡垒机中所进行的运维操作均会以日志的形式记录,管理者即通过日志对微云人员的操作进行安全审计录像。
6、身份认证
为运维人员提供不同强度的认证方式,既可以保持原有的静态口令方式,还可以提供微信、短信等认证方式。堡垒机不仅可以实现用户认证的统一管理,还能为运维人员提供统一一致的认证门户,实现企业的信息资源访问的单点登录。
7、操作审计
将运维人员所有操作日志集中管理与分析,不仅可以对用户行为进行监控与拦截,还可以通过集中的安全审计数据进行数据挖掘,以便于运维人员对安全事故的操作审计认定。

四、运维安全管理与审计系统部署方式

1、单机部署

堡垒机主要都是旁路部署,旁挂在交换机旁边,只要能访问所有设备即可。
部署特点:
旁路部署,逻辑串联。
不影响现有网络结构。
单机部署

2、HA高可靠部署

旁路部署两台堡垒机,中间有心跳线连接,同步数据。对外提供一个虚拟IP。用户通过堡垒机虚拟IP进行访问,堡垒机自动进行会话负载分配和数据同步、冗余存储。
部署特点:
两台硬件堡垒机,一主一备/提供VIP。
当主机出现故障时,备机自动接管服务。
HA高可靠部署

五、常见运维安全管理与审计系统产品

商用

奇安信[运维安全管理与审计系统]:https://www.qianxin.com/product/detail/pid/385
亚信安全[信磐堡垒机]:https://www.asiainfo-sec.com/product/detail-27.html
绿盟[绿盟运维安全管理系统]:https://www.nsfocus.com.cn/html/2019/212_0926/20.html
启明星辰[堡垒机]:https://www.venustech.com.cn/new_type/blj/

开源

麒麟堡垒机:http://www.secvpn.com.cn/
飞致JumpServer堡垒机:https://fit2cloud.com/jumpserver/index.html


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

网络信息安全之信息系统安全保障

发表于 2022-04-29 | 更新于: 2025-04-08 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 3.3k | 阅读时长 ≈ 11

一、信息系统安全保障相关概念

信息系统是用于采集、处理、存储、传输、分发和部署信息的整个基础设施、组织结构、人员和组件的总和。随着当前社会信息化程度的不断提高,各类信息系统越来越成为其所从属的组织机构生存和发展的关键因素,信息系统的安全风险也成为组织风险的一部分。同时,信息系统受来自于组织内部与外部环境的约束,信息系统的安全保障除了要充分分析信息系统本身的技术、业务、管理等特性,还要考虑这些约束条件所产生的要求。为了保障组织机构完成使命,系统安全管理人员必须针对信息系统面临的各种各样的风险制定相应的策略。

信息系统安全保障是在信息系统的整个生命周期中,通过对信息系统的风险分析,制定并执行相应的安全保障策略,从技术、管理、工程和人员等方面提出信息安全保障要求,确保信息系统的保密性、完整性和可用性,把安全风险降到可接受的程度,从而保障系统能够顺利实现组织机构的使命。

信息系统安全保障工作就是针对信息系统在运行环境中所面临的各种风险,制定信息安全保障策略体系,在策略指导下,设计并实现信息安全保障架构或模型,采取技术、管理等安全保障措施,将风险降至预定可接受的程度,从而保障其使命要求。策略体系是组织机构在对风险、资产和使命综合理解的基础上所做出的指导文件。策略体系的制定,反映了组织机构对信息系统安全保障及其目标的理解,它的制定和贯彻执行对组织机构信息系统安全保障起着纲领性的指导作用。
信息系统安全概念和关系

信息系统安全保障工作的基础和前提是风险管理。信息安全策略必须以风险管理为基础,针对可能存在的各种威胁和自身存在的弱点,采取有针对性的防范措施。

二、信息系统安全保障模型

信息系统安全保障模型包含保障要素、生命周期和安全特征3个方面。
信息系统安全保障模型

信息系统安全保障模型的主要思路是以风险和策略为基础,在整个信息系统的生命周期中实施技术、管理、工程和人员保障要素。通过信息系统安全保障实现信息安全的安全特征:信息的保密性、完整性和可用性特征,从而达到保障组织机构执行其使命的根本目的。

模型特点:

  • 将风险和策略作为信息系统安全保障的基础和核心。
  • 强调信息系统安全保障应贯穿于整个信息系统生命周期的全过程。
  • 强调综合保障的观念。通过综合技术、管理、工程和人员要素来保障信息系统安全。

1、基于信息系统生命周期的信息安全保障

信息系统的生命周期层面和保障要素层面不是相互孤立的,而是相互关联、密不可分的。
信息系统安全保障生命周期的安全保障要素

在信息系统生命周期模型中,将信息系统的整个生命周期抽象成计划组织、开发采购、实施交付、运行维护和废弃5个阶段,加上在运行维护阶段的变更产生的反馈,形成信息系统生命周期完整的闭环结构。在信息系统生命周期中的任何时间点上,都需要综合信息系统安全保障的技术、管理、工程和人员保障要素。

  • 计划组织阶段 :根据组织机构的业务要求、法律法规的要求、系统所存在的风险等因素,产生了信息系统安全保障需求。在此阶段,信息安全策略应加入信息系统建设和使用的决策中。从信息系统建设开始,就应该综合考虑系统的安全保障要求,确保信息系统建设和信息系统安全保障建设同步规划、同步实施。也就是我们平时讲的信息系统和安全保障要“三同步”–同步规划、同步建设、同步使用。
  • 开发采购阶段:此阶段是计划组织阶段的细化和具体体现。在此阶段中,进行系统安全需求分析、系统安全体系设计以及相关预算申请和项目准备等活动。在此阶段,应克服传统拘泥于具体技术的片面性,要综合考虑系统的风险和安全策略,将信息系统安全保障作为一个个整体,进行系统地设计,建立信息系统安全保障整体规划和全局视野。组织机构可根据具体要求,对系统整体的技术、管理安全保障规划或设计进行评估,以保证对信息系统的整体规划满足组织机构的建设要求和相关国家与行业的要求。
  • 实施交付阶段:在此阶段,组织机构可通过对承建方进行信息安全服务资格要求和人员专业资格要求以确保施工组织的服务能力;组织机构还可通过信息系统安全保障工程保障对实施施工过程进行监理和评估,最终确保所交付系统的安全性。
  • 运行维护阶段:信息系统进人运行维护阶段后,对信息系统的管理、运行维护和使用人员的能力等方面进行综合保障,是信息系统得以安全正常运行的根本保证。
  • 变更:信息系统投入运行后并不是- - 成不变的,它随着业务和需求的变更、外界环境的变更产生新的要求或增强原有的要求,重新进人信息系统组织计划阶段(即规划阶段)。
  • 废弃阶段:当信息系统不再满足业务要求时,信息系统进入废弃阶段,在这个阶段,需要考虑信息安全销毁等要素。

这样,通过在信息系统生命周期所有阶段融人信息系统安全保障概念,确保了信息系统的持续动态安全保障。

2、信息安全保障要素

1)信息安全技术

信息安全技术体系包括以下几个方面。

  • 密码技术:密码技术及应用涵盖了数据处理过程的各个环节,如数据加密、密码分析、数字签名、身份识别、秘密分享等。通过以密码学为核心的信息安全理论与技术保证数据的机密性和完整性等要求。
    访问控制技术:在为用户对系统资源提供最大限度共享的基础上,对用户的访问权进行管理,防止对信息的非授权篡改和滥用。访问控制对经过身份鉴别后的合法用户提供所需要的且经过授权的服务,拒绝用户越权的服务请求,保证用户在系统安全策略下有序工作。
  • 审计和监控技术:审计是事后认定违反安全规则行为的分析技术,在检测违反安全规则方面、准确发现系统发生的事件以及对事件发生的事后分析方面,审计都发挥着巨大的作用。审计技术的发展,来源于对访问的跟踪,这些访问包括对保存在计算机系统中敏感及重要信息的访问和对计算机系统资源的访问。网络安全监控包括主动监控和被动监控。它依赖于在任何给定时间内网络组件和检测器记录下已经发生的事情,接收日志信息,并对它进行分析。
  • 网络安全技术:这些技术包括网络协议安全、防火墙技术、人侵检测系统/人侵防御系统( Intrusion Detection System/Intrusion Prevention System, IDS/IPS )安全管理平台( Security Operations Center, SOC )、统一威胁管理( Unified Threat Management, UTM )等。网络安全技术主要是保护网络的安全,防止入侵攻击行为的发生。防火墙是一个位于可信网络和不可信网络之间的边界防护系统。防病毒网关防止基于HTTP/FTP/SMTP/POP3/HTTPS等网络协议侵人网络内部的病毒进行过滤。人侵检测系统是一种对网络传输进行即时监视,在发现可疑传输时发出警报措施的网络安全设备。人侵防御系统是监视网络传输行为的安全技术,它能够即时地中断、调整或隔离一些异常或是具有伤害性的网络传输行为。
  • 操作系统与数据库安全技术:操作系统安全技术主要包括身份鉴别、访问控制 、文件系统安全、安全审计等方面。数据库安全技术包括数据库的安全特性和安全功能,数据库完整性要求和备份恢复,以及数据库安全防护、安全监控和安全审计等。
  • 安全漏洞与恶意代码:包括安全漏洞的成因、分类、发掘方法,以及如何修复等;以及恶意代码的加载、隐藏和自我保护技术,恶意代码的检测原理及清除方法等。
  • 软件安全开发:包括软件安全开发模型、软件安全开发关键阶段的安全控制措施等内容。

2)信息安全管理

信息安全管理体系,是组织在整体或特定范围内建立信息安全方针和目标,以及完成这些目标所用方法的体系。基于对业务风险的认识、ISMS包括建立、实施、操作、监视、复查、维护和改进信息安全等一系列的管 理活动,并且表现为组织结构、策略方针、计划活动、目标与原则、人员与责任、过程与方法、资源等诸多要素的集合。

风险管理是指以风险为主线进行信息安全的管理,它的实施目标就是要依据安全标准和信息系统的安全需求,对信息、信息载体、信息环境进行安全管理,以达到安全目标。

风险管理贯穿于整个信息系统生命周期,包括对象确立、风险评估、风险控制、审核批准、监控与审查、沟通与咨询等6个方面的内容。其中,对象确立、风险评估、风险控制和审核批准是信息安全风险管理的4个基本步骤,监控与审查、沟通与咨询则贯穿于这4个基本步骤中。

3)信息安全工程

信息安全工程涉及系统和应用的开发、集成、操作、管理、维护和进化以及产品的开发、交付和升级。

系统安全工程能力成熟模型(Systems Security Engineering Capability Maturity Model,SSE-CMM)描述了一个组织的系统安全工程过程必须包含的基本特征。这些特征是完善的安全工程保证,也是系统安全工程实施的度量标准,同时还是一个易于理解的评估系统安全工程实施的框架。

4)信息安全人才

信息安全保障诸要素中,人是最关键也是最活跃的要素。网络攻防对抗,最终较量的是攻防两端的人,而不是设备。对组织机构来说,应建立一个完整的信息安全人才体系。
信息安全人才体系应包括以下方面。

  • 所有员工:需要进行信息安全保障意识教育,具体可以采用内部培训、在组织机构网站上发布相关信息等措施来增强所有员工的安全意识。
  • 涉及信息系统的岗位和职责的员工:需要进行相应的信息安全保障的基本技能培训。
  • 信息安全专业人员:应建立更全面、更专业的信息安全保障知识和经验。

本文节选自:
《信息安全技术 信息系统安全保障评估框架:简介和一般模型》GB_T 20274.1 200
《CISP培训教材》


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

安全运营之漏洞管理

发表于 2022-04-25 | 更新于: 2025-04-08 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.6k | 阅读时长 ≈ 8

1947年冯·诺依曼建立计算机系统结构理论时认为,计算机系统也有天生的类似基因的缺陷,也可能在使用和发展过程中产生意想不到的问题。20世纪七八十年代,早期黑客的出现和第一个计算机病毒的产生,软件漏洞逐渐引起人们的关注。在各种产品、主机、网络和复杂信息系统中,安全漏洞以不同形式存在,而且数量逐年增加,利用漏洞造成的各类安全事件层出不穷。攻击行为或网络安全事件的发生正越来越多地受到利益驱动的影响,这种“黑色产业链”的兴起,导致越来越多的网络终端受害,大量机密信息被窃取,敏感数据信息在互联网上传播,并在黑市中待价而沽。工业控制领域以及新技术新应用的安全漏洞,特别是基础核心系统的安全漏洞已经成为危害国家经济和发展安全的重要因素。在安全运营过程中一个最重要的工作就是漏洞管理。

一、什么是安全漏洞

安全漏洞(Vulnerability)也被称为脆弱性。
根据国标-信息安全技术-安全漏洞标识与描述规范[GB/T 28458-2012]对安全漏洞的定义,安全漏洞是计算机信息系统在需求、设计、实现、配置运行等过程中,有意或无意产生的缺陷。这些缺陷以不同形式存在于计算机信息系统的各个层次和环节之中,一旦被恶意主体所利用,就会对计算机信息系统的安全造成损害,从而影响计算机信息系统的正常运行,危害信息产品或系统及信息的安全属性。

有时漏洞也被称作错误( Error)、缺陷 ( Fault)、 弱点( Weakness )或是故障( Failure )等,这些术语很容易引起混淆。在许多情况下,人们习惯于将错误、缺陷、弱点都简单地称为漏洞。需要指出的是,严格地说,错误、缺陷、弱点和故障并不等于漏洞。错误、缺陷和弱点是产生漏洞的条件,漏洞被利用后必然会破坏安全属性,但不一定能引起产品或系统故障。

二、安全漏洞标识与描述

以下为国标-信息安全技术-安全漏洞标识与描述规范[GB/T 28458-2012] 对安全漏洞标识与描述的定义:
安全漏洞描述项包括标识号、名称、发布时间、发布单位、类别、等级、影响系统等必须的描述项,并可更具需要扩充(但不限于)相关编号、利用方法、解决方案建议、其他描述等描述项。
安全漏洞描述

标识号
CVD-YYYY-NNNNNN格式为标识号。CVD为Common V ulnerabilities Description 的缩写;YYYY为4位十进制数字,表示产生本安全漏洞的年份;NNNNNN为6位十进制数字,表示当年内产生的安全漏洞的序号。
名称
安全漏洞标题,概括性描述安全漏洞信息的短语,例如InternetExplorer8.0缓冲区溢出漏洞。
发布时间
安全漏洞信息发布日期。
发布单位
发布安全漏洞的单位全称。
类别
安全漏洞所属分类,说明安全漏洞分类归属的信息。
等级
安全漏洞危害级别,说明安全漏洞能够造成的危害程度。
影响系统
安全漏洞所影响系统的信息,例如厂商、产品名称和版本号等。
相关编号
安全漏洞的其他相关编号,例如Bugtraq编号、CVE编号等。
利用方法
安全漏洞利用的方法,例如安全漏洞攻击方案或利用代码。
解决方案建议
安全漏洞的解决方案,例如补丁信息等。
其他描述
安全漏洞描述需要说明的其他相关信息,例如安全漏洞产生的具体原因。

三、安全漏洞的分类分级

分类

网络安全漏洞分类是基于漏洞产生或触发的技术原因对漏洞进行划分,分类如下:
安全漏洞分类

分级

网络安全漏洞分级是指采用分级的方式对网络安全漏洞潜在危害的程度进行描述,包括技术分级
和综合分级两种分级方式,每种方式均分为超危(严重)、高危、中危和低危四个等级,具体内容如下:
超危(严重):漏洞可以非常容易地对目标对象造成特别严重后果;
高危:漏洞可以容易地对目标对象造成严重后果;
中危:漏洞可以对目标对象造成一般后果,或者比较困难地对目标造成严重后果;
低危:漏洞可以对目标对象造成轻微后果,或者比较困难地对目标对象造成一般严重后果,或
者非常困难地对目标对象造成严重后果。

四、安全漏洞的生命周期

依据信息安全漏洞从产生到消亡的整个过程,信息安全漏洞生命周期分以下几个阶段:
a)漏洞的发现:通过人工或者自动的方法分析、挖掘漏洞的过程,并且该漏洞可以被验证和重现。
b)漏洞的利用:利用漏洞对计算机信息系统的保密性、完整性和可用性造成损害的过程。
c)漏洞的修复:通过补丁、升级版本或配置策略等对漏洞进行修补的过程,使得该漏洞不能够被
恶意主体所利用。
d)漏洞的公开:通过公开渠道(如网站、邮件列表等)公布漏洞信息的过程。

五、安全漏洞的闭环管理

根据漏洞生命周期中漏洞所处的不同状态,将漏洞管理行为对应为预防、收集、消减和发布等活动。
漏洞生命周期

预防是指通过各种安全手段提高信息系统的安全水平,避免漏洞的产生和恶意利用。
收集是针对已发现的漏洞进行信息的及时跟踪与获取。
消减是指在漏洞被发现后积极采取补救措施,最大限度减少漏洞带来的损失。
发布是指在遵循一定的发布策略的前提下,对漏洞及其修复信息进行发布。
用户、厂商和漏洞管理组织可以根据漏洞的状态及管理活动建立符合自身特点的漏洞处理策略和处理流程。
对于企业组织安全运营来说可以参考以下漏洞处理流程:
漏洞处理流程

发现漏洞

一般由渗透测试工程师通过漏洞扫描工具或渗透测试发现系统漏洞,提交渗透测试报告。由安全工程师进行漏洞验证,确定系统漏洞是否真实存在。

漏洞录入

在漏洞验证完成后,安全工程师需要根据企业内部的漏洞等级划分标准,将存在的漏洞录入漏洞管理系统。

漏洞分发

漏洞管理系统根据漏洞所影响的业务系统、主机IP等匹配到系统负责部门和修复人。通知系统负责人进行修复加固等。

漏洞跟进及修复

根据漏洞等级设定的时效性,设置修复计划时间,漏洞复验时间,在漏洞管理系统中进行管理和跟进。漏洞修复人修复完成后提交安全工程师进行漏洞复验,验证漏洞是否确实已经修复。如果漏洞在目前的技术条件下确实无法修复,提交系统负责进行风险确认,采取其他规避风险的措施,如调整访控策略、下线等。

漏洞修复周期

漏洞修复周期,包括漏洞的验证、评估、分发、复验、修复和关闭的各个环节。漏洞的修复周期,会根据漏洞等级确定。
参考如下:

漏洞等级 漏洞确认时间 漏洞修复时间
超危(严重) 12小时 24小时
高危 24小时 3*24小时
中危 36小时 7*24小时
低危 72小时 14*24小时

漏洞数据分析

对于漏洞管理整个流程来说,漏洞缓解或已解决后,关闭工单不是最终的目的,需要对漏洞数据进行分析,持续运营,可以从以下几个方面考虑:
1)统计一段时间内,外网系统出现的次数最多的Top10漏洞排名,分析漏洞出现的原因;
如外网系统中出现多次SQL注入漏洞,可以检查WAF的规则库是否及时更新?规则是否生效?此外网系统是否在WAF的防护之内?对外的系统为何不做严格的字符过滤机制等。
2)统计一段时间内,自主开发系统中漏洞数量最多的Top10系统排名,分析造成的原因;
如弱口令次数过多,是安全意识宣传不够?研发人员不重视?
3)哪些供应商的开发的系统漏洞数量最多?分析存在的原因;
是否需要约谈供应商沟通,是安全开发能力的问题,还是研发安全意识不够?
4)哪些框架被利用造成的漏洞过多?
是情报问题?还是应急响应机制的原因?是否可以替换为其他框架?


参考资料
信息安全技术 安全漏洞分类 GBT 33561-2017
信息安全技术 安全漏洞标识与描述规范 GB∕T 28458-2012
信息安全技术 安全漏洞等级划分指南 GB∕T 30279-2013
信息安全技术 信息安全漏洞管理规范 GB/T 30276-2013
安惞《浅谈企业内部安全漏洞的运营(一):规范化》

博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

网络信息安全之基于时间的安全模型(PDR和PPDR模型)

发表于 2022-04-23 | 更新于: 2025-04-08 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.6k | 阅读时长 ≈ 9

基于时间的安全模型是基于”任何安全防护措施都是基于时间的,超过该时间段,这种防护措施是可能被攻破的“这样的前提。该模型主要给出了信息系统的攻防时间表。攻击时间指的是在系统采取某种防守措施,通过不同的攻击手段来计算攻破该防守措施所需要的时间。防守时间指的是,对于某种固定攻击手法,通过采取不同的安全防护措施,来计算该防护措施所能坚守的时间。

基于时间的安全模型主要包括PDR和后来改进的PPDR模型,PDR模型是源自美国国际互联网安全系统公司ISS提出的自适应网络安全模型ANSM(AdaptiveNetwork Security Model),是一个可量化、可数学证明、基于时间的安全模型。美国ISS公司(后被IBM收购)提出的。PPDR模型是PDR的模型上发展起来的,也称P2DR,加入的P是Policy策略。

一、PDR模型

保护-检测-响应( Protection-Detection-Response, PDR )模型是信息安全保障工作中常用的模型,是最早体现主动防御思想的一种网络安全模型,其思想是承认信息系统中漏洞的存在,正视信息系统面临的威胁,通过采取适度防护、加强检测工作、落实对安全事件的响应、建立对威胁的防护来保障系统的安全。
模型图如下图所示:
PDR模型

P-protection,保护就是采用一切可能的措施来保护网络、系统以及信息的安全。通常采用的技术及方法主要包括加密、认证、访问控制、防火墙及防病毒等。

D-detect,检测可以了解和评估网络和系统的安全状态,为安全防护和安全响应提供依据。常用的检测技术主要包括入侵检测、漏洞检测及网络扫描等技术。

R-response,应急响应在安全模型中占有重要地位,是解决安全问题的最有效办法。解决安全问题就是解决紧急响应和异常处理问题,因此,建立应急响应机制,形成快速安全响应的能力,对网络和系统至关重要。

PDR模型直观、实用,建立了一个所谓的基于时间的可证明的安全模型,定义了防护时间Pt(攻击者发起攻击时,保护系统不被攻破的时间)、检测时间Dt(从发起攻击到检测到攻击的时间)和响应时间Rt(从发现攻击到做出有效响应的时间)3个概念,并给出了评定系统安全的计算方式,当Pt>Dt+Rt时,即认为系统是安全的,也就是说,如果在攻击者攻破系统之前发现并阻止了攻击的行为,那么系统就是安全的。

局限性:系统的Pt、Dt、Rt 很难准确定义,面对不同攻击者和不同种类的攻击,这些时间都是变化的,其实还是不能有效证明-一个系统是否安全。并且该模型对系统的安全隐患和安全措施采取相对固定的前提假设,难于适应网络安全环境的快速变化。

二、PPDR模型

策略-保护检测-响应模型( Policy-Protection-Detection-Response, PPDR )是在PDR模型的基础_上发展出来的模型,也称为P2DR模型。模型的核心思想是所有的防护、检测、响应都是依据安全策略实施的,模型包括4个主要部分: Policy (策略)、Protection ( 保护)、Detection(检测)和Response(响应)。
模型图如下图所示:
PPDR模型

策略(Policy):模型的核心,所有的防护、检测和响应都是依据安全策略实施的。安全策略一般由总体安全策略和具体安全策略两部分组成。
保护(Protection):保护是根据系统可能出现的安全问题而采取的预防措施,这些措施通过传统的静态安全技术实现。采用的防护技术通常包括数据加密、身份认证、访问控制、授权和虚拟专用网(VPN)技术、防火墙、安全扫描和数据备份等。
检测(Detection):当攻击者穿透防护系统时,检测功能就发挥作用,与防护系统形成互补。检测是动态响应的依据。
响应(Response):系统一旦检测到人侵,响应系统就开始工作,进行事件处理。响应包括应急响应和恢复处理,恢复处理又包括系统恢复和信息恢复。

PPDR模型是在整体的安全策略的控制和指导下,在综合运用防护工具(如防火墙、操作系统身份认证、加密等)的同时,利用检测工具(如漏洞评估、人侵检测等)了解和评估系统的安全状态,通过适当的反应将系统调整到“最安全”和“风险最低”的状态。保护、检测和响应组成了一个完整的、动态的安全循环,在安全策略的指导下保证信息系统的安全。

该理论的最基本原理就是信息安全相关的所有活动,不管是攻击行为、防护行为、检测行为和响应行为等都要消耗时间,因此可以用时间来衡量一个体系的安全性和安全能力。假设系统的防护、检测和反应时间分别是Pt、Dt和Rt。系统被对手成功攻击后的时间为暴露时间(Et),那么PPDR模型就可以用典型的数学公式来表达安全的要求:如果Pt>Dt+Rt,那么系统是安全的。

P2DR模型中的数学法则:
假设S系统的防护、检测和反应的时间分别是
• Pt(防护时间、有效防御攻击的时间)
• Dt(检测时间、发起攻击到检测到的时间)
• Rt(反应时间、检测到攻击到处理完成时间)
假设系统被对手成功攻击后的时间为
• Et(暴露时间)
则该系统防护、检测和反应的时间关系如下:
• 如果Pt>Dt+Rt,那么S是安全的;
• 如果Pt<Dt+Rt,那么Et=(Dt+Rt)-Pt。

PPDR给出了安全的全新定义:“及时的检测和响应就是安全”,”及时的检测和恢复就是安全”。这样的定义给出了解决安全问题的明确方向:提高系统的防护时间Pt,降低检测时间Dt和响应时间Rt。

与PDR模型相比,PPDR模型更强调控制和对抗,即强调系统安全的动态性,并且以安全检测、漏洞监测和自适应填充“安全间隙”为循环来提高网络安全。值得指出的是,在PPDR模型中,考虑了管理因素,它强调安全管理的持续性、安全策略的动态性,以实时监视网络活动、发现威胁和弱点来调整和填补网络漏洞。另外,该模型强调检测的重要性,通过经常对信息系统的评估把握系统风险点,及时弱化甚至消除系统的安全漏洞。但该模型忽略了内在的变化因素,如人员的流动、人员的素质和策略贯彻的不稳定性。系统本身安全能力的增强、系统和整个网络的优化,以及人员在系统中最重要角色的素质提升,都是该安全系统没有考虑到的问题。

PDR PPDR
意义 最早体现主动防御思想的一种网络安全模型 是动态网络是安全体系的代表模型,动态安全模型的雏形。
组成 保护-检测-响应( Protection-Detection-Response, PDR ) 策略-保护检测-响应模型( Policy-Protection-Detection-Response, PPDR )
特点 PDR模型建立了一个所谓的基于时间的可证明的安全模型,定义了:防护时间Pt (黑客发起攻击时,保护系统不被攻破的时间)、检测时间Dt (从发起攻击到检测到攻击的时间)和响应时间Rt (从发现攻击到作出有效响应的时间)。当Pt>Dt+Rt时,即认为系统是安全的,也就是说,如果在黑客攻破系统之前发现并阻止了黑客的行为,那么系统就是安全的。 给出了安全一个全新的定义:“及时的检测和响应就是安全”,“及时的检测和恢复就是安全”。而且,这样的定义为安全问题的解决给出了明确的方向:提高系统的防护时间Pt,降低检测时间.Dt和响应时间Rt。
局限性 系统的Pt、Dt、Rt 很难准确定义,面对不同攻击者和不同种类的攻击,这些时间都是变化的,其实还是不能有效证明一个系统是否安全。并且该模型对系统的安全隐患和安全措施采取相对固定的前提假设,难于适应网络安全环境的快速变化 忽略了内在的变化因素,如人员的流动、人员的素质和策略贯彻的不稳定性。系统本身安全能力的增强、系统和整个网络的优化,以及人员在系统中最重要角色的素质提升,都是该安全系统没有考虑到的问题。

不管是PDR还是PPDR,总体来说还是局限于从技术上考虑信息安全问题。随着信息化的发展,人们越来越意识到信息安全涉及面非常广,除了技术,管理、制度、人员和法律等方面也是信息安全必须考虑的因素,就像一个由多块木块构成的“木桶”,木桶的容量由最短的那块板决定。在处理信息安全问题时,必须全面考虑各方面的因素,任何一个方面的遗漏都有可能形成“短板”。


作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

网络信息安全之零信任

发表于 2022-04-21 | 更新于: 2025-04-08 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 3.6k | 阅读时长 ≈ 12

一、零信任产生的背景

对于资源的访问保护,传统方式是划分安全区域,不同的安全区域有不同的安全要求。在安全区域之间就形成了网络边界,在网络边界处部署边界安全设备,包括防火墙、IPS、防毒墙、WAF等,对来自边界外部的各种攻击进行防范,以此构建企业网络安全体系,这种传统方式可称为边界安全理念。在边界安全理念中网络位置决定了信任程度,在安全区域边界外的用户默认是不可信的(不安全的),没有较多访问权限,边界外用户想要接入边界内的网络需要通过防火墙、VPN等安全机制;安全区域内的用户默认都是可信的(安全的),对边界内用户的操作不再做过多的行为监测,但是这就在每个安全区域内部存在过度信任(认为是安全的,给予的权限过大)的问题。同时由于边界安全设备部署在网络边界上,缺少来自终端侧、资源侧的数据,且相互之间缺乏联动,对威胁的安全分析是不够全面的,因此内部威胁检测和防护能力不足、安全分析覆盖度不够全面成为了边界安全理念固有的软肋。甚至很多企业只是非常粗粒度的划分了企业内网和外网(互联网),这种风险就更为明显。

另外,随着云计算、物联网以及移动办公等新技术新应用的兴起,企业的业务架构和网络环境也随之发生了重大的变化,这给传统边界安全理念带来了新的挑战。比如云计算技术的普及带来了物理安全边界模糊的挑战,远程办公、多方协同办公等成为常态带来了访问需求复杂性变高和内部资源暴露面扩大的风险,各种设备(BYOD、合作伙伴设备)、各种人员接入带来了对设备、人员的管理难度和不可控安全因素增加的风险,高级威胁攻击(钓鱼攻击、水坑攻击、0day漏洞利用等)带来了边界安全防护机制被突破的风险,这些都对传统的边界安全理念和防护手段,如部署边界安全设备、仅简单认证用户身份、静态和粗粒度的访问控制等提出了挑战,亟需有更好的安全防护理念和解决思路。

传统边界安全理念先天能力存在不足,新技术新应用又带来了全新的安全挑战,在这样的背景下,零信任的最早雏形源于2004年成立的耶利哥论坛(Jericho Forum ),其成立的使命正是为了定义无边界趋势下的网络安全问题并寻求解决方案,提出要限制基于网络位置的隐式信任;美国国防信息系统局(DISA)为了解决GIG(全球信息栅格,是美军信息化作战规划中极其重要且宏大的基础设施)中,如何实时、动态地对网络进行规划和重构的问题,发起了BlackCore项目,将基于边界的安全模型转换为基于单个事物安全性的模型,并提出了SDP(Software Defined Perimeter)的概念,该概念后来被云安全联盟(Cloud Security Alliance)采纳。2010年,由著名研究机构Forrester的首席分析师John Kindervag最早提出了零信任(Zero Trust)的概念,并由Google在BeyondCorp项目中率先得到了应用,很好的解决了边界安全理念难以应对的安全问题。

二、零信任的定义

根据NIST《零信任架构标准》中的定义:零信任(Zero Trust,ZT)提供了一系列概念和思想,在假定网络环境已经被攻陷的前提下,当执行信息系统和服务中的每次访问请求时,降低其决策准确度的不确定性。零信任架构(ZTA)是一种企业网络安全的规划,它基于零信任理念,围绕其组件关系、工作流规划与访问策略构建而成。

零信任代表了新一代的网络安全防护理念,并非指某种单一的安全技术或产品,其目标是为了降低资源访问过程中的安全风险,防止在未经授权情况下的资源访问,其关键是打破信任和网络位置的默认绑定关系。

在零信任理念下,网络位置不再决定访问权限,在访问被允许之前,所有访问主体都需要经过身份认证和授权。身份认证不再仅仅针对用户,还将对终端设备、应用软件等多种身份进行多维度、关联性的识别和认证,并且在访问过程中可以根据需要多次发起身份认证。授权决策不再仅仅基于网络位置、用户角色或属性等传统静态访问控制模型,而是通过持续的安全监测和信任评估,进行动态、细粒度的授权。安全监测和信任评估结论是基于尽可能多的数据源计算出来的。

零信任理念的基本假设、基本原则如下:
1、零信任理念的基本假设
a) 内部威胁不可避免;
b) 从空间上,资源访问的过程中涉及到的所有对象(用户、终端设备、应用、网络、资源等)默认都不信任,其安全不再由网络位置决定;
c) 从时间上,每个对象的安全性是动态变化的(非全时段不变的)。
2、零信任的基本原则
a)任何访问主体(人/设备/应用等),在访问被允许之前,都必须要经过身份认证和授权,避免过度的信任;
b)访问主体对资源的访问权限是动态的(非静止不变的);
c)分配访问权限时应遵循最小权限原则;
d)尽可能减少资源非必要的网络暴露,以减少攻击面;
e)尽可能确保所有的访问主体、资源、通信链路处于最安全状态;
f)尽可能多的和及时的获取可能影响授权的所有信息,并根据这些信息进行持续的信任评估和安全响应。

零信任在所有需要对资源访问进行安全防护的场景都可以使用,但是否采用,应根据企业可接受的安全风险水平和投入综合考虑决定。

三、零信任技术体系

目前零信任主要有三大技术体系,分别是SDP(软件定义安全)、IAM(增强身份管理)和MSG(微隔离)。
零信任三大技术体系

1、软件定义安全(SDP)

SDP即“软件定义边界”,是国际云安全联盟CSA于2014年提出的基于零信任(Zero Trust)理念的新一代网络安全模型。SDP在使应用程序所有者能够在需要时部署安全边界,以便将服务与不安全的网络隔离开来。SDP将物理设备替换为在应用程序所有者控制下运行的逻辑组件。SDP仅允许在设备验证和身份验证后访问企业应用程序基础架构。SDP的体系结构由两部分组成:SDP主机和SDP控制器。SDP主机可以发起连接或接受连接。这些操作通过安全控制通道与SDP 控制器交互来管理。
SDP软件定义边界

SDP安全优势:
1.SDP最大限度地减少攻击面,降低安全风险;
2.SDP通过分离访问控制和数据通道来保护关键资产和基础设施,从而防止潜在的基于网络的攻击;
3.SDP提供了现有安全设备难以实现的整体集成安全架构。
4.SDP提供了一种基于连接的安全体系结构,而不是基于IP的替代方案。由于整个IT环境的爆炸式增长,云环境中缺乏边界使得基于IP的安全性变得脆弱。
5.SDP允许对所有连接进行预检查和控制,从这些连接可以连接设备、服务和设施,因此其整体安全性比传统架构更有利。

2、增强身份管理(IAM)

增强身份管理IAM是大多数组织实现安全和IT运营策略的核心。它使企业可以自动访问越来越多的技术资产,同时管理潜在的安全和合规风险。身份管理为所有用户,应用程序和数据启用并保护数字身份。
零信任身份与访问管理

身份管理可以帮助组织有效解决复杂业务带来的挑战,并平衡四个关键目标:
1.加强安全,降低风险。
2.提高合规性和审计绩效。
3.提供快速有效的业务访问。
4.降低运营成本。

3、微隔离(MSG)

微隔离是一种网络安全技术,它可以将数据中心在逻辑上划分为各个工作负载级别的不同安全段,然后定义安全控制并为每个唯一段提供服务。微隔离使IT人员可以使用网络虚拟化技术在数据中心内部部署灵活的安全策略,而不必安装多个物理防火墙。微隔离可用于保护每个虚拟机(VM)在具有策略驱动的应用程序级安全控制的企业网络中。微隔离技术可以大大增强企业的抵御能力。
威隔离MSG

微隔离是在数据中心和云部署中创建安全区域的一种方法。这种方法使企业组织能够分离工作负载并分别保护它们,从而使网络安全更加完善,从而更加有效。
以下是微隔离的一些优点:
1.减少攻击面
2.提高横向运动的安全性
3.安全关键应用
4.提高合规性

四、如何实现零信任体系

零信任的覆盖范围很广,根据企业的实际情况,可参考如下过程执行逐步建立零信任安全体系。

1、建立统一的认证平台,提升基础安全及执行能力
建立统一的认证能力平台,为所有业务系统提供认证能力。所有业务平台对接认证能力平台以获得中级及以上认证能力,大幅降低因认证方式带来的风险。
可结合已经建立的 4A 系统,升级 4A 系统认证体系。使用多因素认证提高安全等级。收集并绑定设备指纹,将每台设备(PC 端或移动 端)与账户关联绑定。通过账号与设备的绑定,实现用 户、账号、设备三位一体的认证体系。建立以零信任网关为核心的控制体系,该方式将大大提高对用户访问行为的控制,弥补现有业务系统在访 控制方面的安全短板。建立采集系统,在用户使用业务系统时,采集行为和环境信息。零信任网关体系可以与 4A 系统和其它业务系统结合,通过代理技术隐藏所有被代理系统的 IP 和端口,并对用户的访问行为进行鉴权检测。

2、升级或部署EDR,加强终端管控和行为风险发现能力
加强客户端监管,可通过升级资产与基线管理平台或部署EDR终端控制接入软件,对终端环境进行基线扫描和检查预警。对于不符合要求的终端,通过统一身份认证平台禁止其接入,同时,给出修复建议。
建立大数据处理系统,并通过该系统将上一阶段收集的用户行为信息进行统计和分析,结合电信内部管理规章制度,制定一套有针对性的基础专家规则。同时,建立规则引擎,规则引擎根据专家规则判断用户当前环境和行为风险。如果在规则中缺少必要信息指标,通过调整采集指标达到目标。
在基础规则基础上,根据不同的业务系统特点,深入挖掘与业务系统紧密相关的规则。结合认证方式在各个接入了认证能力平台的业务系统中实现自适应处置,使用户体会到初级智能化安全。规则引擎与身份认证系统对接,对接完成后,可以通过对用户访问各个业务系统的检测评估发现潜在风险,主要包括冒名访问和违规操作。

3、引入智能工具,从传统安全向智慧安全转变
建立机器学习平台,引入齐全的人工智能模型和可视化工具,利用前期收集的用户数据,训练适配的模型,建立智能规则引擎,对用户请求的行为信息和环境信息进行自动化评估,关联前期部署的规则引擎,验证并改良智能规则和引擎。通过机器学习平台建立无感知认证模型,作为辅助认证方式进一步提高用户体验,从“有认证”升华至“无认证”。通过大数据和机器学习模型,结合深度挖掘技术建立用户画像库,识别用户行为习惯,践行“行为即指纹”理念,实现“零信任”的终极目标。

参考资料来源:
零信任产业标准工作组《零信任实战白皮书》
《零信任架构的3大核心技术》
《零信任网络安全》
《零信任技术系统规范》


作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

<1…121314…20>
XieJava

XieJava

200 日志
11 分类
25 标签
RSS
GitHub
友情链接
  • 爱分享读书
  • CSDN
  • 豆瓣
© 2025 XieJava | Site words total count: 415.3k

主题 — NexT.Muse
0%