Congress 是云端开放的策略框架。云的操作者可以通过 Congress 在异构云环境中申报、监测、执行和审计“策略”。Congress 从云端不同的云服务中获取输入;例如在OpenStack 中,Congress 从 Nova、Neutron的网络状态中获VMs 信息。然后 Congress会把这些输入数据从这些服务中输入到策略引擎当中,在那里Congress 可以通过云运营商的政策来验证云端实际的状态。
一 Congress 架构
如上图所示Congress 主要包括策略引擎和一些云服务的driver或者其他的数据store来为策略引擎提供数据源,并根据策略完成一系列可自定义的动作。
其主要架构由Drivers、policy、Capabilities、Congress Server and API几部分构成。其中最重要的是policy、Capabilitie、auditing部分主要由三部分组成:
1、Drivers
Driver则是针对这些服务的驱动,Congress主要采用这些driver和云服务联系,并获取到源数据,提供给策略引擎来根据用户自定义的策略做处理。
目前支持的driver已经比较多了,包括:
aodh、cinder、neutronv2、swift、nova、ceilometer、keystonev3、glancev2、heat
比如nova的driver收集的信息如下:
--------------------------------------------- | VM id | Name | Status | Power State | ... | --------------------------------------------- | 12345 | foo | ACTIVE | Running | ... | | ... | | | | | ---------------------------------------------
2、policy
policy则是由用户自定义的策略,用户可以根据目前云平台的各种driver中收集的源数据条目来设计。目前来说Congress 采用Datalog 作为一种策略的语言。
Datalog 是一种针对演绎式数据库的查询和规则语言,其在语法构成上是Prolog 的一个子集。Datalog 的查询求值是合理和完全的和甚至针对大型数据库都能够有效完成。
查询求值通常使用至上而下策略。对受限形式的 datalog 不允许任何功能符号,查询求值的安全被保证。policy Engine为策略引擎,主要负责自定义策略的设置和匹配,而下面的driver则负责各个组件源数据的收集。
3、Capabilities
当Congress上面配置好了策略,便可以根据策略做如下三种动作:
• monitoring the cloud for policy violations
就是根据上面设置的policy来分类过滤上面driver中的源数据,如果发现源数据中有和设置的policy规则有冲突的地方,那么就把有冲突的配置放到另一个自定义的表中去,比如 “error”表。便于其它模块或者云维护人员来查询。
• Proactive Enforcement
这个就是说在上面监控的基础上可以去避免冲突的发生,具体的做法其实是采用模拟的方式,比如nova 需要新配置一个VM,带有2个不同的物理网络的vnic,那么可以在congress中采用模拟增加源数据表的方式,增加一条带有2个vnic的VM的source date在nova的server表中,而原有的策略是VM只能有一个vnic那么policy就会发现这个条目和原有的policy冲突,会在error的表中加上这个VM的信息。
• Reactive Enforcement
该功能其实就是在发生violations的时候可以自动纠正问题,这个就需要采用相应的命令去执行,比如在上面的例子中,当发现新建的VM和已经有的规则有冲突,在规则中需要加上 execute表示要通过nova去删除从而修复。
• Inter active Enforcement
这个就和上面的区别是需要人的加入,有的场景下,不需要系统自动的去做操作。
4、Auditing
历史记录的查询(目前还没有实现)
要实现上面的集中功能。congress实现了下面的策略表格:
a) Classification policy .
分类的策略就是识别了哪一个是错误的,需要我们去纠正的。所以这个功能是一切的基础。
下面举个例子。
b )Enforcement Policy.
这个策略就是设置了当当前云处于某一个装态的时候,去执行什么样的操作
c) Access Control policy
这个策略是表示哪个用户在哪种情况下允许执行哪条命令。
Congress Server and API
Congress 会单独跑一个server进程,并给client测提供RESTful API服务,driver作为服务其中的一部分被执行。
API部分允许下面的操作:
a 插入和删除策略
b 检查策略是否有冲突
c 模拟输入的数据源是否和现有的策略冲突
d 执行相应的动作
从上面的介绍可以看到Congress是一个策略配置、策略检查、策略执行的组件,其源数据主要来源于各个driver的上报。对于DC的监控、管理是非常有作用的。同时针对不同策略还可以对云平台中各种资源归类收集。从而为DC中的分类处理提供了可能。
二 Congress的使用
通过上面的介绍,我们知道了,congress的架构和执行策略,下面我们通过三个简单的例子来说明congress是如何使用的。
1、分类出router名字为test的router的id
需求:
假设我们需要把所有route的name为test的route找出来
分析:
可以看到我们的需求就是要分类出所有router的名字是test的,那么我们需要分类的策略去把名字为test的router放到一个单独的表中去。
用到的Data Sources
● Neutron
步骤:
创建一个名字叫做reserved_subnet_error表,并把所有CIDR为192.168.1.0/24的子网放到这个里面
penstack congress policy rule create test_class "error(id):-
neutronv2:routers(id, col_1, col_2, col_3, "test", col_5)"
2、保留特定的子网网段,不允许使用
需求:
假设我们要保留192.168.1.0/24的子网网段不允许在当前的DC中使用。如果一旦发现有人使用了这个网段,我们就把使用的子网强制删除。
分析:
可以看到我们的需求就是需要保留192.168.1.0的网段,那么我们就需要有一个分类和一个执行的policy,分类的策略需要识别出这个网段的子网,并把这个自网放到reserved_subnet_error的表中去;而执行的策略则是把这个表中的子网删除掉,具体如下:
用到的Data Sources
● Neutron
Policy
● Reactive:
步骤:
创建一个名字叫做reserved_subnet_error表,并把所有CIDR为192.168.1.0/24的子网放到这个里面
openstack congress policy rule create test "reserved_subnet_error(x):- neutronv2:subnets(id=x, cidr='192.168.1.0/24')" --name rsv_subnet_test
删除reserved_subnet_error表里面的子网
openstack congress policy rule create test "execute[neutronv2:delete_subnet(x)]:-reserved_subnet_error(x)" --name deleted_reserved_subnet_error
3、发现在ingress方向TCP端口号25(SMTP)打开的VM
需求:
假设我们要防止有vm打开TCP端口为25的端口服务
分析:
可以看到我们的需求就是需要防止有vm打开TCP端口为25的服务,那么我们就需要有一个分类和一个执行的policy,分类的策略需要识别出这个VM,并把这个自网放到smtp_ingress的表中去;而执行的策略则是把这个vm停掉,具体如下:
用到的Data Sources
● Neutron
● Nova
Policy
● Reactive
步骤:
创建一个名字叫做smtp_ingress表,并把所有vm的安全组中TCP端口号为25的端口打开的vm放到这个表里面去
openstack congress policy rule create est "smtp_ingress(x):- nova:servers(id=x,status='ACTIVE'), neutronv2:ports(port_id, status='ACTIVE'), neutronv2:security_groups(sg,tenant_id, sgn,sgd), neutronv2:security_group_port_bindings(port_id,sg), neutronv2:security_group_rules(sg, rule_id, tenant_id, remote_group_id, 'ingress', ethertype, 'tcp', port_range_min, port_range_max, remote_ip), lt(port_range_min,26), gt(port_range_max, 24)" --name smtp_ingress
把上面表中的vm停止
openstack congress policy rule create test "execute[nova:servers.pause(id)]:-smtp_ingress(id), nova:servers(id,status='ACTIVE')" --name paused_smtp_ingress
三 congress的安装
采用devstack安装,具体步骤如下:
1、下载devstack
$ git clone https://git.openstack.org/openstack-dev/devstack.git
$ cd devstack
2、修改local.conf 增加如下内容
[[local|localrc]]
enable_plugin congress https://git.openstack.org/openstack/congress
enable_plugin heat https://git.openstack.org/openstack/heat
enable_plugin aodh https://git.openstack.org/openstack/aodh
enable_plugin ceilometer https://git.openstack.org/openstack/ceilometer
enable_service s-proxy s-object s-container s-account
3、修改run devstack
$ ./devstack.sh