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 set集合类型操作总结
Nov 07 Python
浅谈Python程序与C++程序的联合使用
Apr 07 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 Python
Python编写登陆接口的方法
Jul 10 Python
python+pandas分析nginx日志的实例
Apr 28 Python
python调用百度REST API实现语音识别
Aug 30 Python
Python线程下使用锁的技巧分享
Sep 13 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
python装饰器练习题及答案
Nov 01 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
Jul 13 Python
在Django中使用MQTT的方法
May 10 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中防止SQL注入实现代码
2011/02/19 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
CodeIgniter集成smarty的方法详解
2016/05/26 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
通过代码实例解析PHP session工作原理
2020/12/11 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
IE8 兼容性问题(属性名区分大小写)
2009/06/04 Javascript
JS 自定义带默认值的函数
2011/07/21 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
你所未知的3种Node.js代码优化方式
2016/02/25 Javascript
JS组件Bootstrap Select2使用方法解析
2016/05/30 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
小程序最新获取用户昵称和头像的方法总结
2019/09/23 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
python自定义函数def的应用详解
2020/06/03 Python
详解python with 上下文管理器
2020/09/02 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
SmartBuyGlasses丹麦:网上购买名牌太阳镜、眼镜和隐形眼镜
2016/10/01 全球购物
生物科学专业个人求职信范文
2013/12/05 职场文书
餐厅采购员岗位职责
2014/03/06 职场文书
写求职信要注意什么问题
2014/04/12 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
董事长岗位职责
2015/02/13 职场文书
介绍信怎么写
2015/05/05 职场文书
困难补助申请报告
2015/05/19 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
MySQL创建管理KEY分区
2022/04/13 MySQL