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之玩转字符串(1)
Sep 14 Python
详解Python迭代和迭代器
Mar 28 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
python3实现全角和半角字符转换的方法示例
Sep 21 Python
Python3实现发送QQ邮件功能(html)
Dec 15 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
python 追踪except信息方式
Apr 25 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 Python
python必学知识之文件操作(建议收藏)
May 30 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 array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
php写app接口并返回json数据的实例(分享)
2017/05/20 PHP
详解将数据从Laravel传送到vue的四种方式
2019/10/16 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
xml和web特殊字符
2009/04/28 Javascript
点击隐藏页面左栏或右栏实现js代码
2013/04/01 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
小程序转发探索示例
2019/02/19 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
vue+element实现打印页面功能
2019/05/20 Javascript
vue实现记事本功能
2019/06/26 Javascript
Element-UI中关于table表格的那些骚操作(小结)
2019/08/15 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
[55:48]VGJ.S vs TNC Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python编程中用close()方法关闭文件的教程
2015/05/24 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
python使用pygame框架实现推箱子游戏
2018/11/20 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
YII2 全局异常处理深入讲解
2021/03/24 PHP
毕业生优秀推荐信
2013/11/26 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android