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中将阿拉伯数字转换成中文的实现代码
May 19 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
Python使用POP3和SMTP协议收发邮件的示例代码
Apr 16 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
Python图像处理库PIL的ImageGrab模块介绍详解
Feb 26 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
Nov 25 Python
Python classmethod装饰器原理及用法解析
Oct 17 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
Dec 04 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
定制404错误页面,并发信给管理员的程序
2006/10/09 PHP
MYSQL环境变量设置方法
2007/01/15 PHP
Dedecms常用函数解析
2008/02/01 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
php批量修改表结构实例
2017/05/24 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
Tensorflow加载预训练模型和保存模型的实例
2018/07/27 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
九年级政治教学反思
2014/02/06 职场文书
法定代表人授权委托书
2014/04/04 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL