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 09 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
flask中使用蓝图将路由分开写在不同文件实例解析
Jan 19 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
python logging设置level失败的解决方法
Feb 19 Python
使用Django搭建网站实现商品分页功能
May 22 Python
python线程优先级队列知识点总结
Feb 28 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
python基础之文件操作
Oct 24 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
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
javascript中的有名函数和无名函数
2007/10/17 Javascript
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
本人自用的global.js库源码分享
2015/02/28 Javascript
javascript数组排序汇总
2015/07/07 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
python数据类型之间怎么转换技巧分享
2019/08/20 Python
Python搭建Keras CNN模型破解网站验证码的实现
2020/04/07 Python
python函数超时自动退出的实操方法
2020/12/28 Python
python中pivot()函数基础知识点
2021/01/03 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
德国最大的网上鞋店之一:Schuhe24.de
2017/06/10 全球购物
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
SQL里面IN比较快还是EXISTS比较快
2012/07/19 面试题
土建施工员岗位职责
2014/07/16 职场文书
代办社保委托书范文
2014/10/06 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
Redis RDB技术底层原理详解
2021/09/04 Redis
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技