ACL
ACL管理
初始化
确认Endpoint
在确认您使用SDK,需要配置Endpoint时,理解Endpoint相关的概念。 百度智能云目前开放了多区域支持,请参考区域选择说明。 目前支持“华北-北京”、“华南-广州”、"华东-苏州"、"香港"、"金融华中-武汉"和"华北-保定"六个区域。对应Endpoint信息为:
访问区域 | 对应Endpoint |
---|---|
华北-北京 | bcc.bj.baidubce.com |
华南-广州 | bcc.gz.baidubce.com |
华东-苏州 | bcc.su.baidubce.com |
香港 | bcc.hkg.baidubce.com |
金融华中-武汉 | bcc.fwh.baidubce.com |
华北-保定 | bcc.bd.baidubce.com |
获取密钥
要使用百度智能云ACL,您需要拥有一个有效的 AK(Access Key ID)和SK(Secret Access Key)用来进行签名认证。AK/SK是由系统分配给用户的,均为字符串,用于标识用户,为访问BOS做签名验证。 可以通过如下步骤获得并了解您的AK/SK信息: 注册百度智能云账号 创建AK/SK
新建AclClient
AclClient是ACL服务的客户端,为开发者与ACL服务进行交互提供了一系列的方法。
通过AK/SK方式访问ACL
1.在新建AclClient之前,需要先创建配置文件对AclClient进行配置,以下将此配置文件命名为acl_sample_conf.py,具体配置信息如下所示:
#!/usr/bin/env python
#coding=utf-8
#导入Python标准日志模块
import logging
#从Python SDK导入ACL配置管理模块以及安全认证模块
from baidubce.bce_client_configuration import BceClientConfiguration
from baidubce.auth.bce_credentials import BceCredentials
#设置AclClient的Host,Access Key ID和Secret Access Key
acl_host = "bj.bcebos.com"
access_key_id = "AK"
secret_access_key = "SK"
#设置日志文件的句柄和日志级别
logger = logging.getLogger('baidubce.http.bce_http_client')
fh = logging.FileHandler("sample.log")
fh.setLevel(logging.DEBUG)
#设置日志文件输出的顺序、结构和内容
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.setLevel(logging.DEBUG)
logger.addHandler(fh)
#创建BceClientConfiguration
config = BceClientConfiguration(credentials=BceCredentials(access_key_id, secret_access_key), endpoint = acl_host)
注意: 针对日志文件,Logging有如下级别:DEBUG,INFO,WARNING,ERROR,CRITICAL。
在上面代码中,access_key_id对应控制台中的“Access Key ID”,secret_access_key对应控制台中的“Access Key Secret”,获取方式请参考《操作指南 管理ACCESSKEY》。
上面的方式用户需要自己指定BOS的服务的域名,可以通过赋值给bos_host变量来指定。不指定时无需传入endpoint参数,默认为北京区域http://bos.bj.bcebos.com。
2.在完成上述配置之后,参考如下代码新建一个AclClient。
#导入AclClient配置文件
import acl_sample_conf
#导入ACL相关模块
from baidubce import exception
from baidubce.services import vpc
from baidubce.services.vpc.acl_client import AclClient
#新建AclClient
acl_client = AclClient(acl_sample_conf.config)
配置HTTPS协议访问ACL
您可以通过如下两种方式在ACL Python SDK中使用HTTPS访问ACL服务:
- 在endpoint中指定HTTPS:
config = bce_client_configuration.BceClientConfiguration(
credentials = bce_credentials.BceCredentials(
access_key_id = 'your-ak',
secret_access_key = 'your-sk'
),
endpoint = 'https://bj.bcebos.com'
)
client = acl_client.AclClient(config)
- 通过在protocol中指定https来设置HTTPS协议:
config = bce_client_configuration.BceClientConfiguration(
credentials = bce_credentials.BceCredentials(
access_key_id = 'your-ak',
secret_access_key = 'your-sk'
),
endpoint = 'bj.bcebos.com',
protocol = baidubce.protocol.HTTPS
)
client = acl_client.AclClient(config)
注意: 如果您在指定了endpoint的scheme的同时指定了protocol参数,则以endpoint为准。
ACL管理
访问控制列表ACL(Access Control List)是VPC内的防火墙组件,用于控制子网级别的安全策略,灵活设置一个或多个子网的流量,满足用户不同网络部署的安全需求。 ACL管理前,需要关注下列内容:
条目 | ACL规则 |
---|---|
ACL范围 | ACL隶属于VPC,生效对象为该VPC下的子网 |
控制实例类型 | ACL访问控制策略生效于子网下的所有实例,包括BCC、DCC、BBC、RDS、SCS等实例 |
默认ACL规则 | 系统为每个子网创建了默认的ACL,该ACL中有一条默认规则,允许所有规则。默认规则不可以编辑 |
入站或出站 | 入站、出站的方向是指,站在子网下实例角度看到的方向 |
规则最大限制 | 对于同一个ACL下的规则,每个方向支持最多256个规则 |
规则触发 | 流量一旦匹配了ACL中某条规则,即触发访问控制策略(允许或拒绝),不会继续和其他的规则进行匹配 |
ACL状态 | ACL是无状态的,只对一条数据流的指定方向流量做访问控制,不会自动对该条数据流的返回流量做控制。 |
新建ACL
如下代码可以创建一个ACL:
acl_rule_list = [{
'subnetId':'$subnetId',
'protocol':'udp',
'sourceIpAddress':'10.0.0.0/16',
'destinationIpAddress':'172.16.0.0/24',
'sourcePort':'80',
'destinationPort':'80',
'position':3,
'direction':'ingress',
'action':'allow',
'description':'test'
}]
acl_client = AclClient(acl_sample_conf.config)
response = acl_client.create_acl(rule_list=acl_rule_list)
print (response)
create_acl参数包括rule_list:list类型,可以包含多条acl规则。acl规则参数如下:
参数名称 | 类型 | 是否必需 | 描述 |
---|---|---|---|
subnetId | String | 是 | 子网的ID |
protocol | String | 是 | 协议,包括all tcp udp icmp |
sourceIpAddress | String | 是 | 源IP |
destinationIpAddress | String | 是 | 目的IP |
sourcePort | String | 是 | 源端口,例如1-65535,或8080 |
destinationPort | String | 是 | 目的端口,例如1-65535,或8080 |
position | Integer | 是 | 优先级 1-5000且不能与已有条目重复。数值越小,优先级越高,规则匹配顺序为按优先级由高到低匹配 |
direction | String | 是 | 规则的入站ingress 规则的出站egress |
action | String | 是 | 策略,包括allow和deny |
description | String | 否 | 备注 |
注意:
- ACL规则按优先级由高到低匹配,例如优先级50的规则会优先于顺序为100的规则。
- 优先级输入范围是1-32768,作为典型实践,建议上下两条规则的优先级数值区间要大,便于后期调整,如100,200,300等。
- 在同样入站/出站的方向下,不同规则的优先级不能相同。
- 设置ingress规则,需要destinationIpAddress在subnet cidr范围内;设置egress规则,需要sourceIpAddress在subnet cidr范围内。
列举ACL
列举ACL可以分为两个纬度,分别为列举vpc内所有ACL规则和subnet内所有ACL规则。
列举vpc内所有ACL
如下代码可以列举某个vpc内所有的ACL规则:
acl_client = AclClient(acl_sample_conf.config)
response = acl_client.list_acl_entrys(vpc_id='$vpc_id')
print (response.acl_entrys)
list_acl_entrys参数包括vpc_id,填写要列举ACL规则的vpc ID。
注意: 返回信息包含acl_entrys,acl_entrys是一个list列表,包含vpc内不同子网的ACL规则。
列举subnet内所有ACL
如下代码可以列举某个subnet内所有的ACL规则:
response = acl_client.list_subnet_acl(subnet_id='$subnet_id')
for acl_rule in response.acl_rules:
print (acl_rule)
list_subnet_acl参数包括subnet_id,填写要列举ACL规则的subnet ID。
更新ACL
如下代码可以更新ACL规则:
response = acl_client.update_acl(acl_rule_id='$acl_rule_id', source_ip_address='10.10.0.0/16')
print (response)
update_acl参数包括acl_rule_id和Acl规则的各个字段。acl_rule_id指定要更新的ACL,其他字段指定要更新的规则内容。字段内容可见新建ACL参数列表,除去subnetId其他字段均可更新。
注意: 更新ACL规则字段时,依然要符合各个字段的填写要求。
删除ACL
如下代码可以删除ACL规则:
response = acl_client.delete_acl(acl_rule_id='ar-fzfvhxdzrkxn')
print (response)
delete_acl参数主要包括acl_rule_id,确定要删除的ACL规则。
注意: acl_rule_id可以通过列举ACL获取,其中默认ACL规则不显示acl_rule_id,不能对默认ACL规则进行更新和删除。