Python脚本修改阿里云的访问控制列表的方法


Posted in Python onMarch 08, 2019

需求

对于部署在阿里云上的重要系统一般是不让其他人访问的,所以会在负载均衡(SLB)上加上访问控制列表。而使用ASDL拨号上网的宽带来说一般公网IP都不会固定的,会随时变更公网IP,所以此脚本正是解决此需求。

说明

脚本运行前需要先安装aliyun-python-sdk-core 和aliyun-python-sdk-slb 2个sdk,并且在阿里云账户里面创建access_key和access_secret。

脚本会查询到目前的公网IP,如何创建本地一个文件将IP记录到文件里,下次执行时会将查询到的IP和文件里的对比,如果IP和文件里记录的IP不一致则将IP添加到访问控制列表里。
最后只需要在服务器里每隔一段时间执行一次此脚本就OK。

sdk 下载:https://developer.aliyun.com/tools/sdk#/python

提醒

如果是重要的数据在公网传输,还是尽量使用加密传输。毕竟阿里云的SSL 和IPSEC 也很完善了,推荐使用。

#!/usr/bin/env python3
#coding:utf-8

from aliyunsdkcore import client
import time,requests
from aliyunsdkslb.request.v20140515 import AddAccessControlListEntryRequest
from aliyunsdkcore.profile import region_provider
#region_provider.modify_point('slb', '<regionId>', 'slb.<regionId>.aliyuncs.com')

# 名称:阿里云负载均衡白名单自动修改脚本

### 变量配置 ###
# 保存历史IP地址的文件名
file_save_ipaddr = 'ipaddr.txt'
# 一些可以获取本机出口IP的API地址
ip_api_list = 'http://icanhazip.com,http://ident.me,http://ifconfig.me,http://ipecho.net/plain,http://whatismyip.akamai.com,http://myip.dnsomatic.com'
# SLB 配置,此 Access Key 只需添加 ACL 的权限
aliyun_access_key = 'xxxxxxxxx'
aliyun_access_secret = 'xxxxxxxxxxxxxx'

# 在这里可以获取region:https://help.aliyun.com/document_detail/40654.html
aliyun_region = 'cn-hangzhou'
# 访问列表一(acl-bp1792k8uvk11xxpgu5l)
# 访问列表二(acl-bp1okd1kud9a41kyjkja)
# 需要修改的ACL的ID,进入负载均衡控制台 -> 访问控制 -> 策略ID
aliyun_acl_id = ['acl-bp1okd1kud9a41kyjkja','acl-bp1792k8uvk11xxpgu5l']
### 配置结束 ###

def getExitIpAddr(ip_api_list):
  '''获取出口IP地址'''
  url_list = str(ip_api_list).split(',')
  ip = None
  for url in url_list:
    resp = requests.get(url,timeout=3)
    if resp.status_code == 200:
      ip = resp.text.strip()
      break
  return ip

def setAcl(access_key,access_secret,region,acl_id,ip):
  '''修改ACL'''
  clt = client.AcsClient(access_key,access_secret,region)
  # 设置参数
  request = AddAccessControlListEntryRequest.AddAccessControlListEntryRequest()
  request.set_accept_format('json')
  request.add_query_param('AclId',acl_id)
  request.add_query_param('RegionId',region)
  request.add_query_param('Tags', 'API自动添加')
  request.add_query_param('AclEntrys', '[{{"entry":"{ip}/32","comment":"此处是注释{d}"}}]'.format(ip=ip,d=time.strftime("%Y-%m-%d",time.localtime())))
    #添加ip并添加注释

  # 发起请求
  response = clt.do_action_with_exception(request)

  print(response)

def getSavedIp(filename):
  '''获取已保存的IP'''
  try:
    with open(filename,'r',encoding='utf-8') as f:
      return f.readline()
  except IOError:
    print("文件不存在")

def saveNewIp(filename,ipaddr):
  '''保存新IP'''
  with open(filename,'w',encoding='utf-8') as f:
    f.write(ipaddr)

def main():
  current_ip = getExitIpAddr(ip_api_list)
  saved_ip = getSavedIp(file_save_ipaddr)
  print('当前IP',current_ip)
  print('保存的IP',saved_ip)
  if current_ip == saved_ip:
    print('IP无变化')
    exit(0)
  else:
    for acl_id in aliyun_acl_id:
      setAcl(access_key=aliyun_access_key,
          access_secret=aliyun_access_secret,
          region=aliyun_region,
          acl_id=acl_id,
          ip=current_ip)
      time.sleep(5)
    saveNewIp(file_save_ipaddr,current_ip)

if __name__ == '__main__':
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 模拟员工信息数据库操作的实例
Oct 23 Python
wxPython的安装图文教程(Windows)
Dec 28 Python
python获取程序执行文件路径的方法(推荐)
Apr 26 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
python实现合并两个排序的链表
Mar 03 Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 Python
django 基于中间件实现限制ip频繁访问过程详解
Jul 30 Python
浅析python中while循环和for循环
Nov 19 Python
Tensorflow的梯度异步更新示例
Jan 23 Python
python中sympy库求常微分方程的用法
Apr 28 Python
Python pip install之SSL异常处理操作
Sep 03 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
python实现整数的二进制循环移位
Mar 08 #Python
Python3实现的反转单链表算法示例
Mar 08 #Python
Python3实现的判断回文链表算法示例
Mar 08 #Python
python字符串循环左移
Mar 08 #Python
详解Python Matplot中文显示完美解决方案
Mar 07 #Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 #Python
Python3实现的判断环形链表算法示例
Mar 07 #Python
You might like
PHP中for与foreach的区别分析
2011/03/09 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
windows中为php安装mongodb与memcache
2015/01/06 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
php远程下载类分享
2016/04/13 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
JavaScript URL参数读取改进版
2009/01/16 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
javascript instanceof 内部机制探析
2010/10/15 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
JS实现在状态栏显示打字效果完整实例
2015/11/02 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jQuery操作Table技巧大汇总
2016/01/23 Javascript
第八篇Bootstrap下拉菜单实例代码
2016/06/21 Javascript
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
2016/11/21 NodeJs
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
关于Python面向对象编程的知识点总结
2017/02/14 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
详解Python 解压缩文件
2019/04/09 Python
解决Python3 控制台输出InsecureRequestWarning问题
2019/07/15 Python
Python 使用threading+Queue实现线程池示例
2019/12/21 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
详解python的变量缓存机制
2021/01/24 Python
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
英国哈罗德园艺:Harrod Horticultural
2020/03/31 全球购物
应聘自荐信
2013/12/14 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
单位介绍信格式
2015/01/31 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
MySql新手入门的基本操作汇总
2021/05/13 MySQL