服务器访问控制——基于组网结构前端有防火墙,服务器都在防火墙内,内部使用内网ip的架构

应领导要求设计的禁止访问外网策略,核心思想为网关去掉或添加。而普通用户没有修改路由表得权限,从而达到禁止访问外网得目的。



#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Create date: 2018-10-17
Last update: 2018-10-23
Version: 1.1
Description:登陆限制需求:
             X.X网段不允许访问外网
             root用户登陆可以访问外网
             root用户登陆情况下普通用户无法禁止访问外网,除非root用户也不访问外网
             普通用户登陆不允许访问外网
             普通用户可以申请一段时间访问外网
Usage method:放入crontab中自定义执行间隔,不给参数时,除非root用户登陆,否则不允许自行访问外网,
              可以传递1个参数,必须是数字,可以是浮点数,表示普通用户可以访问外网的时间,单位为小时。
                添加关闭打开功能
Author: Yefei
'''
import psutil
import os
import sys
import datetime

# 网关ip地址设定
GW_IP = "10.0.3.1"


def help():
    print("""使用方式:
          1, %s  不加参数使用时,除非root登陆,否则不允许访问外网
          2, %s float(sys.argv[1]) 可以传递一个参数,当参数是数字得时候,表示可以访问外网的时间长度,单位为小时。
          3, %s open|close  表示打开或关闭外网,不限时长
          """ % (sys.argv[0], sys.argv[0], sys.argv[0]))


def isfloat(value):
    try:
        x = float(value)
    except TypeError:
        return False
    except ValueError:
        return False
    except Exception as e:
        return False
    else:
        return True


# 删除网关函数
def delGateWay():
    CMD = 'route del default gw %s' % (GW_IP)
    os.popen(CMD)


# 添加网关函数
def addGateWay():
    CMD = 'route add default gw %s' % (GW_IP)
    os.popen(CMD)


# 检查网关是否存在
def gateWayCheck():
    flag = False
    for line in routList:
        if GW_IP in line:
            flag = True
            return flag


# 检查用户是否是root
def userCheck():
    flag = False
    for User in userList:
        if User.name == "root":
            print("用户是root")
            flag = True
            return flag


# 网关添加
def userOnline(flag):
    print(flag)
    if flag:
        print("检测网关已存在,退出程序")
        sys.exit()
    else:
        print("添加网关")
        addGateWay()


# 网关删除
def userOffline(flag):
    if flag:
        print("检测网关已存在,删除网关")
        delGateWay()
    else:
        print("检测网关不存在,退出程序")
        sys.exit()


# 将普通用户访问外网的时间节点写入文件,当到达此事件后去掉网关
def FileForTime(scheme, *args):
    if scheme == "w":
        with open("/root/controltime", "w") as recordTime:
            now = datetime.datetime.now()
            endTime = now + datetime.timedelta(hours=args[0])
            endStrTime = endTime.strftime('%Y-%m-%d %H:%M:%S')
            recordTime.write(endStrTime)
            if now < endTime:
                return True
            else:
                return False
    elif scheme == "r":
        with open("/root/controltime", "r") as recordTime:
            endStrTime = recordTime.readline().strip()
            if len(endStrTime) > 10:
                endTime = datetime.datetime.strptime(endStrTime, '%Y-%m-%d %H:%M:%S')
                now = datetime.datetime.now()
                if now < endTime:
                    return True
                else:
                    return False
            else:
                return False


if __name__ == '__main__':
    routList = []
    routList = os.popen("route -n")
    userList = psutil.users()
    if len(sys.argv) >= 2:
        if sys.argv[1] == "open":
            userOnline(gateWayCheck())
        elif sys.argv[1] == "close":
            userOffline(gateWayCheck())
        elif isfloat(sys.argv[1]):
            hoursLen = float(sys.argv[1])
            print(hoursLen)
            if FileForTime('w', hoursLen):
                print("用户可以上网")
                userOnline(gateWayCheck())
            else:
                print("用户不可以上网")
                userOffline(gateWayCheck())
        elif sys.argv[1] == help:
            help()
        else:
            help()
    else:
        if len(userList) > 0 and userCheck():
            userOnline(gateWayCheck())
        elif os.path.exists("/root/controltime"):
            if FileForTime("r"):
                userOnline(gateWayCheck())
            else:
                userOffline(gateWayCheck())
        else:
            userOffline(gateWayCheck())

 

posted on 2018-10-17 22:20  kcrist  阅读(660)  评论(0编辑  收藏  举报

导航