1
2

More than 3 years have passed since last update.

大量のIP RangeリストをAWS Security Groupに反映するスクリプト(メモ)

Posted at

Security Groupのルールを設定する雑スクリプトです。作業メモ的に残しておきます。

Azure PipelineのIPが多すぎ(100個以上)、デフォルトでSecurity GroupのRuleは60個まで。という面倒な状態だったので、雑にPythonスクリプト作りました。

背景(前提?)的なもの

  • AWS側Security Groupで、IP制限している。
    • Azureのサービス(Azure Pipeline等)からAWS側に接続したいがIP制限でNGになる。
  • 設定すべきプロトコルとポートは、HTTPS:443 だけで充分。
  • Azureで使用されるIPは下記URLで公開されている(JSONファイルでダウンロードできる)。

スクリプト

Python3で、ソースコードを3ファイルに分けてます。同じフォルダに入れてください。

  • main.py
    • このファイル内に書いてあるSecurity Group IDを修正してから実行。
    • 60 ルール毎にSG分割する想定(Part1とPart2)。120個を超える場合は、SG(Part3)を追加してください。
  • aws_sg.py
    • awsへの更新処理
  • azure_ip_range.py
    • 設定したいIPのリスト。自動で最新情報を取得はしてないので、必要に応じて修正

main.py

'''
usage: 
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ python main.py
'''
import os
import aws_sg
import azure_ip_range

## TODO: Security Goupr id が決め打ち(ソース内で固定)。

print('AWS_DEFAULT_REGION: %s' % os.getenv("AWS_DEFAULT_REGION"))

def main():

    IP_LIST = azure_ip_range.get_ip_list()

    # Divide rule by 60 ranges. AWS の制限(60 rules/security group)
    SECURITY_GROUP_ID_1 = "sg-XXXXXXXXXXXXXXXXX" # Azure.DevOps.part1
    SECURITY_GROUP_ID_2 = "sg-XXXXXXXXXXXXXXXXX" # Azure.DevOps.part2

    ip_permissions_1 = aws_sg.build_ip_permissions(IP_LIST[:60], 'AzureCloud.eastasia')
    ip_permissions_2 = aws_sg.build_ip_permissions(IP_LIST[60:], 'AzureCloud.eastasia')

    # Clear inbound rules of Security Group 
    aws_sg.revoke_all_ingress(SECURITY_GROUP_ID_1)
    aws_sg.revoke_all_ingress(SECURITY_GROUP_ID_2)

    # set ip limitation
    aws_sg.set_ip_limitations(SECURITY_GROUP_ID_1, ip_permissions_1)
    aws_sg.set_ip_limitations(SECURITY_GROUP_ID_2, ip_permissions_2)

    print('Ingress Successfully Set: %s' % SECURITY_GROUP_ID_1)
    print('Ingress Successfully Set: %s' % SECURITY_GROUP_ID_2)

if __name__ == "__main__":
    main()

aws_sg.py

import boto3
from botocore.exceptions import ClientError


def build_ip_permissions(ip_list, desc):
    '''
    build permission for HTTPS Access
    '''

    ip_ranges = [ {'CidrIp': ip, 'Description': desc} for ip in ip_list]

    return [
        {'IpProtocol': 'tcp', 'FromPort': 443, 'ToPort': 443, 'IpRanges':ip_ranges}
    ]


def revoke_all_ingress(security_group_id):

    # Specify Security group by id
    sg = boto3.resource('ec2').SecurityGroup(security_group_id)

    # remove all Ip Permissions
    if sg.ip_permissions:
        res = sg.revoke_ingress(IpPermissions=sg.ip_permissions)


def set_ip_limitations(security_group_id, ip_permissions):

    # Set Ip permissions for Ingress
    res = boto3.client('ec2').authorize_security_group_ingress(
        GroupId=security_group_id,
        IpPermissions=ip_permissions
    )
    return res

azure_ip_range.py

def get_ip_list():
    return IP_LIST

# 
# TODO: Get ip range from Web API(like this.)
# -------------powershell
# $body = @{“region”=“asiaeast”;“request”=“dcip”} | ConvertTo-Json
# $webrequest = Invoke-WebRequest -Method “POST” -uri https://azuredcip.azurewebsites.net/api/azuredcipranges -Body $body
# ConvertFrom-Json -InputObject $webrequest.Content
# -------------
#  See: https://social.technet.microsoft.com/wiki/contents/articles/50886.azure-get-datacenter-ip-address-ranges-via-api.aspx
# 
#
# 以下、下記URLからダウンロードしたJSONファイルの中から、
# "name": "AzureCloud.eastasia"の部分を切り出したもの。
# 
# See: https://www.microsoft.com/en-us/download/confirmation.aspx?id=56519
IP_LIST = [
    "13.70.0.0/18",
    "13.72.192.0/19",
    ...
]

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2