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实现把json格式转换成文本或sql文件
Jul 10 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 Python
Python初学者常见错误详解
Jul 02 Python
Python使用循环神经网络解决文本分类问题的方法详解
Jan 16 Python
什么是python的必选参数
Jun 21 Python
Python加速程序运行的方法
Jul 29 Python
Django实现文章详情页面跳转代码实例
Sep 16 Python
PyQt5的QWebEngineView使用示例
Oct 20 Python
python 下划线的不同用法
Oct 24 Python
python palywright库基本使用
Jan 21 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
用Flash图形化数据(二)
2006/10/09 PHP
PHP面向对象概念
2011/11/06 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
多个jQuery版本共存的处理方案
2015/03/17 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
2018/03/01 Javascript
layui的table单击行勾选checkbox功能方法
2018/08/14 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
js实现鼠标拖拽缩放div实例代码
2019/03/25 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
vue+element模态框中新增模态框和删除功能
2019/06/11 Javascript
基于Layui自定义模块的使用方法详解
2019/09/14 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
一则python3的简单爬虫代码
2014/05/26 Python
200行自定义python异步非阻塞Web框架
2017/03/15 Python
Python实现图片转字符画的示例
2017/08/22 Python
获取Django项目的全部url方法详解
2017/10/26 Python
python 公共方法汇总解析
2019/09/16 Python
python3.7将代码打包成exe程序并添加图标的方法
2019/10/11 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
基于python判断字符串括号是否闭合{}[]()
2020/09/21 Python
美赞臣新加坡官方旗舰店:Enfagrow新加坡
2019/05/15 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
关于是否需要写商业计划书
2014/02/07 职场文书
保险公司晨会主持词
2014/03/22 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
横店影视城导游词
2015/02/06 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
oracle索引总结
2021/09/25 Oracle