一、应用场景
公司服务器使用阿里云,有很多后台管理系统如kibana、jenkins、Apollo配置中心等应用。为了安全,这些系统是无法从互联网访问的,为了方便管理,使用了阿里云的 负载均衡+白名单 的技术方案,这样就可以从公司通过互联网访问这些管理系统了。但公司上网IP经常变化,每次手动添加白名单很不方便。为了解决此问题,写了个脚本可以自动把当前公网IP添加到白名单中。通过定时任务的方式执行
二、配置访问控制RAM
-
策略管理 -> 自定义策略
-
新建授权策略:
-
名称:
AliyunSLBAddAclOnly -
备注:添加SLB黑白名单
-
策略内容:
{ "Version": "1", "Statement": [ { "Action": "slb:AddAccessControlListEntry", "Resource": "*", "Effect": "Allow" } ] }
-
-
用户管理 -> 新建用户。
-
新建用户,并生成
AccessKey,注意保存好子用户AccessKey和AccessSecret,没记录下也没关系,可以重新生成一个。 -
给此用户授以
AliyunSLBAddAclOnly权限(就是上面自定义的那条策略)
三、安装python模块
pip install aliyun-python-sdk-slb requests
四、脚本内容 aliyun_slb_acl_set.py
#!/usr/bin/env python
#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 = '<changeme>'
aliyun_access_secret = '<changeme>'
# region不清楚是不是必须和白名单在同一个区
# 在这里可以获取region:https://help.aliyun.com/document_detail/40654.html
aliyun_region = 'cn-hangzhou'
# 需要修改的ACL的ID,进入负载均衡控制台 -> 访问控制 -> 策略ID
aliyun_acl_id = ['acl-xxxxxxxxchangeme','acl-aaaaaaaachangeme2']
### 配置结束 ###
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())))
# 发起请求
response = clt.do_action_with_exception(request)
print response
def getSavedIp(filename):
'''获取已保存的IP'''
try:
with open(filename,'r') as f:
return f.readline()
except IOError,e:
print "文件不存在"
def saveNewIp(filename,ipaddr):
'''保存新IP'''
with open(filename,'w') 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 aliyun_slb_acl_set.py
结果怎么样,可以云看白名单
六、其它说明
- 如果IP地址没发生变化,则不会请求阿里云添加IP
- 只有添加白名单功能,过期的需要手动清理
- 监控频率在定时任务中设置
- 参考:https://api.aliyun.com/?#product=Slb

本文介绍如何使用Python脚本自动将公司公网IP添加到阿里云负载均衡SLB的白名单中,以实现对内部系统的远程管理。通过定时执行脚本,简化了频繁更改白名单的过程。
1099

被折叠的 条评论
为什么被折叠?



