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实现的多线程端口扫描功能示例
Jan 21 Python
利用Python破解斗地主残局详解
Jun 30 Python
在pycharm上mongodb配置及可视化设置方法
Nov 30 Python
基于python实现百度翻译功能
May 09 Python
python 消除 futureWarning问题的解决
Dec 25 Python
浅析Python3 pip换源问题
Jan 06 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 Python
Python爬虫之Selenium鼠标事件的实现
Dec 04 Python
python爬虫之selenium库的安装及使用教程
May 23 Python
怎么用Python识别手势数字
Jun 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
global.php
2006/12/09 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
利用JS重写Cognos右键菜单的实现代码
2010/04/11 Javascript
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
jQuery实现手机号码输入提示功能实例
2015/04/30 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
全面了解javascript三元运算符
2016/06/27 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
2016/07/05 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
详解node Async/Await 更好的异步编程解决方案
2018/05/10 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
layui导出所有数据的例子
2019/09/10 Javascript
vue resource发送请求的几种方式
2019/09/30 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
深入理解Django的自定义过滤器
2017/10/17 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
惠普香港官方商店:HP香港
2019/04/30 全球购物
家长对学生的评语
2014/04/18 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
浅谈Python数学建模之线性规划
2021/06/23 Python
Python anaconda安装库命令详解
2021/10/16 Python
Python常遇到的错误和异常
2021/11/02 Python
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL