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中文竖排显示的方法
Jul 28 Python
详解Python的Flask框架中的signals信号机制
Jun 13 Python
Python3如何解决字符编码问题详解
Apr 23 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
Python post请求实现代码实例
Feb 28 Python
python中str内置函数用法总结
Dec 27 Python
Python编写万花尺图案实例
Jan 03 Python
python数字转对应中文的方法总结
Aug 02 Python
Python 可迭代对象 iterable的具体使用
Aug 07 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
复杂检索数据并分页显示的处理方法
2006/10/09 PHP
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
php中如何防止表单的重复提交
2013/08/02 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
php微信开发之自定义菜单完整流程
2016/10/08 PHP
php pdo操作数据库示例
2017/03/10 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
Javascript Select操作大集合
2009/05/26 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
在jQuery中处理XML数据的大致方法
2015/08/14 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
详解angular中如何监控dom渲染完毕
2017/01/03 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
python服务器端收发请求的实现代码
2014/09/29 Python
利用Python如何生成随机密码
2016/04/20 Python
python实现五子棋小程序
2019/06/18 Python
django中间键重定向实例方法
2019/11/10 Python
Python类反射机制使用实例解析
2019/12/30 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
苹果中国官方网站:Apple中国
2016/07/22 全球购物
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
介绍一下游标
2012/01/10 面试题
如何用Java实现列出某个目录下的所有子目录
2015/07/20 面试题
最新教师自我评价分享
2013/11/12 职场文书
创业计划书怎样才能打动风投
2014/01/01 职场文书
通报表扬范文
2015/01/17 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
MySQL笔记 —SQL运算符
2022/01/18 MySQL