通过安全组授权入网经典网络的安全组

安全组入网规则授权说明

如果有两个用户,用户A有一个安全组A1,另外一个安全组A2, 另外一个用户B有一个安全组B1,安全组A2和安全组B1的云服务器想要实现对安全组A中的云服务器进行网络访问,需要进行下面的设置。

访问经典网络user-A-sg-1安全组内资源的入网规则设置如下表所示,您可以通过控制台直接操作也可以调用OpenApi来实现.

设置 同一用户的安全组 user-A-sg-1的服务器 同一用户的安全组 user-A-sg-2的服务器 另一个用户B的安全组 user-B-sg-1 服务器
入方向访问 互通 不通 不通
入方向设置 不需要设置 1. 在user-A-sg-1的安全组内网入规则加一条规则, ["SourceGroupId": "user-A-sg-2", "IpProtocol": "tcp", "PortRange": "80/80"] 2. 在user-A-sg-1的安全组内网入规则加一条规则, ["SourceCidrIp": "IP地址/32", "IpProtocol": "tcp", "PortRange": "80/80"] 1. 在user-A-sg-1的安全组内网入规则加一条规则, ["SourceGroupId": "user-B-sg-1", "SourceGroupOwnerId": "user-B", "IpProtocol": "tcp", "PortRange": "80/80"] 2. 在user-A-sg-1的安全组内网入规则加一条规则, ["SourceCidrIp": "IP地址/32", "IpProtocol": "tcp", "PortRange": "80/80"]

安全组设置内网互通的方法

操作指引 参见 安全组设置内网互通的方法

将当前账号下的经典网络安全组通过安全组授权入网

如果之前已经在经典网络上设置了允许过大的入网网段访问,例如 0.0.0.0/0 或者 10.0.0.0/8。如果你没有授权其他的用户访问当前安全组内资源的计划,你可以选择添加其他的安全组作为入网的授权规则,逐个添加完其他的安全组之后测试您的应用,逐个删除之前过大的CIDR网段。

下面提供了一个脚本,它将会根据您的入参安全组ID,将本region内其他的有云服务器的安全组作为入网规则加入您的安全组之中。目前这个版本有如下限制, 附件中包含所有的代码。

  • 不支持VPC类型的安全组
  • 不支持已添加和即将添加的规则超过100条的场景
  • 您可以选择ignore一些安全组,不加入
  • 只支持单个region 50个安全组的场景
#  coding=utf-8

# if the python sdk is not install using 'sudo pip install aliyun-python-sdk-ecs'
# if the python sdk is install using 'sudo pip install --upgrade aliyun-python-sdk-ecs'
# make sure the sdk version is 2.1.2, you can use command 'pip show aliyun-python-sdk-ecs' to check

import json
import logging

from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.AuthorizeSecurityGroupRequest import \
    AuthorizeSecurityGroupRequest
from aliyunsdkecs.request.v20140526.DescribeSecurityGroupAttributeRequest import \
    DescribeSecurityGroupAttributeRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest

# configuration the log output formatter, if you want to save the output to file,
# append ",filename='ecs_invoke.log'" after datefmt.
from aliyunsdkecs.request.v20140526.DescribeSecurityGroupsRequest import \
    DescribeSecurityGroupsRequest

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S')

clt = client.AcsClient('Your Access Key Id', 'Your Access Key Secrect', 'cn-beijing')

TOTAL_COUNT = 'TotalCount'
# 需要开放的端口范围 协议为tcp、udp时默认端口号,取值范围为1~65535;例如“1/200”意思是端口号范围为1~200,若输入值为:“200/1”接口调用将报错。
# 协议为icmp时端口号范围值为-1/-1;
# gre协议时端口号范围值为-1/-1;
# 协议为all时端口号范围值为-1/-1
PORT_RANGE = '-1/-1'

# IP协议,取值:tcp | udp | icmp | gre | all;
# all表示同时支持四种协议
IP_PROTOCOL = 'all'

# 网络协议,这里只设置经典网络的安全组的内网规则
NIC_TYPE = 'intranet'

# 接受协议
POLICY = 'accept'

# 优先级 1-100, 1最高 100最容易被覆盖
PRIORITY = 10

# 经典网络的ID不需要添加到规则里面的接受规则里面的
SECURITY_GROUP_IDS_IGNORE_ADD = ['sg-ignore-1', 'sg-ignore-2', 'sg-ignore-3']

# 这个工具用来扫描您的经典网络安全组,并且将同一个Region下其它有ECS的经典网络的安全组ID添加到您的内网入规则中,
# 以实现您的一个region内的所有的ECS内网互通。目前这个脚本只支持单region下50个安全组。
# dry run 仅仅计算不执行
def add_security_group_rule(sg_id, priority=10, dry_run=True):
    request = DescribeSecurityGroupsRequest()
    request.set_SecurityGroupId(sg_id)
    response = _send_request(request)
    security_groups = response.get('SecurityGroups').get('SecurityGroup')
    if len(security_groups) == 0:
        logging.error("Current input security group id %s can not be found in current region",
                      sg_id)
    else:
        sg_detail = security_groups[0]
        if sg_detail is not None:
            vpc_id = sg_detail.get('VpcId')
            if vpc_id != '':
                logging.error(
                    "The tools is only for classical security group now, not support vpc security group %s.",
                    sg_id)
            else:
                current_permissions = query_sg_rules_for_sg(sg_id)
                logging.info(current_permissions)
                SECURITY_GROUP_IDS_IGNORE_ADD.append(sg_id)
                sg_ids = query_all_classical_security_group_include_instance(
                    SECURITY_GROUP_IDS_IGNORE_ADD)
                if len(current_permissions) + len(sg_ids) > 100:
                    logging.error(
                        "Current security group  %s already with too many rules, the max rules is 100 for all the ruels.",
                        sg_id)
                logging.info("it will add %s total in %d rules for security group %s.", sg_ids,
                             len(sg_ids), sg_id)
                if dry_run == False:
                    for sg_id_in in sg_ids:
                        execute_add_classical_intranat_ingress(sg_id, sg_id_in, priority, dry_run)

# 为经典网络的云服务器添加内网的入规则
def execute_add_classical_intranat_ingress(source_sg_id, in_sg_id, priority, dry_run):
    request = AuthorizeSecurityGroupRequest()
    request.set_SecurityGroupId(source_sg_id)
    request.set_IpProtocol(IP_PROTOCOL)
    request.set_Policy(POLICY)
    request.set_NicType(NIC_TYPE)
    request.set_Priority(priority)
    request.set_PortRange(PORT_RANGE)
    request.set_SourceGroupId(in_sg_id)
    if dry_run:
        logging.info("add sg id %s as the in security group id %s", in_sg_id, source_sg_id)
    else:
        response = _send_request(request)
        return response

# 查询当前的安全组下有多少条规则
def query_sg_rules_for_sg(security_group_id):
    request = DescribeSecurityGroupAttributeRequest()
    request.set_SecurityGroupId(security_group_id)
    response = _send_request(request)
    permissions = response.get('Permissions').get('Permission')
    total_count = len(permissions)
    logging.info("Current security group %s with rule %d", security_group_id, total_count)
    return permissions

# 过滤那些安全组有云服务器实例
def query_all_classical_security_group_include_instance(exclude_security_group_ids=[]):
    request = DescribeSecurityGroupsRequest()
    request.set_PageSize(50)
    response = _send_request(request)
    with_instance_sg_ids = []
    total_count = response.get(TOTAL_COUNT)
    if total_count > 100:
        logging.warning("you have more than 100 security group in current region....")
    security_groups = response.get('SecurityGroups').get('SecurityGroup')
    for security_group in security_groups:
        vpc_id = security_group.get('VpcId')
        sg_id = security_group.get('SecurityGroupId')
        if vpc_id == '':
            request = DescribeInstancesRequest()
            request.set_PageSize(1)
            request.set_SecurityGroupId(sg_id)
            list_instance_response = _send_request(request)
            sg_with_instance_count = list_instance_response.get(TOTAL_COUNT)
            if sg_with_instance_count > 0:
                with_instance_sg_ids.append(sg_id)
        else:
            logging.info("security group %s is vpc ", sg_id)
    return list(set(with_instance_sg_ids).difference(set(exclude_security_group_ids)))

# send open api request
def _send_request(request):
    request.set_accept_format('json')
    try:
        response_str = clt.do_action(request)
        logging.info(response_str)
        response_detail = json.loads(response_str)
        return response_detail
    except Exception as e:
        logging.error(e)

if __name__ == '__main__':
    logging.info("Hello!")
    # 实际运行中,请选择您的安全组Id,并将Dry_Run设置为False
    # 如果为VPC的安全组就会报错。
    add_security_group_rule('sg-add-rules', PRIORITY, True)
时间: 2024-10-31 19:25:45

通过安全组授权入网经典网络的安全组的相关文章

经典网络迁移VPC最佳实践

摘要:阿里云起步于经典网络,但已经全面转向VPC.专有网络VPC以其在安全.成本和网络功能方面的优势,正受到越来越多用户的欢迎.在9月6日技术直播中,阿里云高级产品专家谭礼铨(李泉)为大家分享了经典网络迁移VPC最佳实践,本次分享介绍三种将ECS从经典网络迁移至VPC网络的途径,并阐述三种类型的迁移分别适合怎样的客户需求和场景. 直播回顾视频地址:https://yq.aliyun.com/webinar/play/287 9月21日,2017阿里云网络技术高峰论坛将独家线上直播,欢迎预约:ht

VPC最佳实践(六):业务如何从经典网络平滑迁移到VPC

专有网络VPC(Virtual Private Cloud)正受到越来越多用户的欢迎,已经成为云上用户的首选网络类型,也是阿里云默认推荐的网络类型.然而,云上还有很多存量用户在使用经典网络,这些用户如何从经典网络迁移到VPC呢?本文将介绍相关的迁移方案. 方案概述 阿里云将提供三种迁移方案.这三个方案可以独立使用,也可以组合使用,以满足不同的迁移场景. 混挂和混访方案 ClassicLink方案 单ECS迁移方案 混挂和混访方案 混挂和混访方案是一种系统平滑迁移方案,即用户通过在VPC中新建EC

阿里云网络系列之经典网络和专有网络

阿里云面向客户提供的网络类型服务有经典网络和专有网络两种,但这两者有什么区别呢?阿里官网给的解释是: 经典网络:IP地址由阿里云统一分配,配置简便,使用方便,适合对操作易用性要求比较高.需要快速使用 ECS 的用户. 专有网络:是指逻辑隔离的私有网络,您可以自定义网络拓扑和 IP 地址,支持通过专线连接.适合于熟悉网络管理的用户   相信很多人看了这个解释还是云里雾里,作为用户你该如何判断哪一种是适合自己的网络类型呢: 其实,可以这样简单地理解,从公网ip来讲,经典网络和专有网络没有区别:从内网

【文件存储NAS】NAS正式支持经典网络挂载啦!

功能和特点 自今年3月31日正式公测以来,文件存储NAS已经成为了阿里云家族中非常受大家欢迎的产品之一,非常感谢各位用户的鼓励.支持和包容! 阿里云始终将用户的数据安全作为一切工作的核心,因此为了充分打磨和测试经典网络环境中,文件存储的安全能力,保障用户的数据安全,我们没有在公测第一时间就推出经典网络的支持.经过一段时间的验证和测试,即日起 文件存储NAS正式开放支持经典网络ECS虚拟机挂载! 文件存储在经典网络中具备以下功能特点: 易用: 可以为任意文件系统实例创建经典网络挂载点,挂载方式与V

ECS经典网络实例支持升级到企业级实例

目前ECS在进行升级配置时,支持专有网络.IO优化的实例进行跨系列升级,从系列I.系列II升级到系列III最新一代的实例规格.详见(ECS入门级到企业级) 重点来了!(敲黑板) ECS已推出经典网络IO优化实例升配到企业级实例的功能! 为什么要升级到企业级实例? ECS经典网络实例升级到企业级实例,可以获得最新一代的实例规格带来的更好的计算性能,更高的IOPS与PPS,远强于入门级的综合性价比. 企业级实例具备更强的计算性能与可靠性,更适合于核心生产业务需求.详见(阿里云发布ECS企业级产品家族

基于资源编排在经典网络环境下快速部署高可用的Dubbox服务(Redis版)

本文将介绍在经典网络环境下,基于资源编排快速部署高可用Dubbox服务的过程.做这件事情的意义在于:提供给开发者一套高可用的Dubbox服务框架,节约开发人员部署Dubbox服务的时间,并降低了部署Dubbox过程中出错的风险. ROS阿里云资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务.用户通过模板描述多个云计算资源的依赖关系.配置等,并自动完成所有资源的创建和配置,以达到自动化部署.运维等目的.编排模板同时也是一种标准化的资源和应用交付

经典网络的ECS实例支持升级到企业级实例

既上一篇升级系列文(ECS经典网络实例支持升级到企业级实例 支持IO优化.经典网络实例升级到企业级实例)之后,ECS控制台升级功能又迎来了重要更新. 现在可以在控制台对 非IO优化 .经典网络的ECS实例升级配置到企业级实例(sn2,sn1,sn2ne,sn1ne,c4,cm4等). 注:暂支持Linux系统的ECS实例,Windows系统的实例很快将开放,请关注后续更新. 升级注意事项 和IO优化.经典网络的实例一样,升级需要注意以下两件事情: 一.实例的内网IP可能会发生变化 经典网络实例,

经典网络还是VPC,开发者作何选择?

摘要:近两天,关于公有云经典网络与私有网络(VPC)的讨论引发技术圈极大关注. 近两天,关于公有云经典网络与私有网络(VPC)的讨论引发技术圈极大关注,事件起因于有开发者将数据库限制在内网访问,但由于安全组设置的原因,阿里云邻居用户被黑后,牵连到了自己的业务.为此,开发者@左耳朵耗子发表了<科普一下公有云网络>,指出阿里云默认的内网是经典网络,管理复杂,配置错误是高概率事件,呼吁大家采用VPC方案,防止重现上述事故. 对比起"谈安全色变",圈内理性探讨总归是好事.这次&qu

咕咚上云之路:从阿里云经典网络迁移VPC实战

本文正在参加"最佳上云实践"评选,来给我们投票吧:https://yq.aliyun.com/activity/158(编号58) 咕咚是独树一帜的互联网运动品牌,全国最大的全民运动社交平台,国内颠覆用户传统运动观念的倡导者和先行者. 作为全球互联网运动社交领军品牌,目前咕咚用户数量已超过8000万每天需要响应来自全球207个国家的数千万次运动需求. 2016年5月31日,咕咚在北京宣布完成C轮融资,融资额达5000万美元,由分众传媒与方源资本携手成立的体育基金领投,SIG(海纳亚洲创