zoukankan      html  css  js  c++  java
  • 【代码运行服务】安全问题

    执行用户代码在线编译或者函数调用,必须要考虑到安全性的问题,因为用户的脚本嵌在后台服务中运行,用户的权限和服务的权限是一致的,如何做到安全或者说尽量降低用户的破坏带来的风险

    文件安全的问题

    是否可以使用python虚拟环境的方式,这样隔离相互不影响,但是这样一来用户调用执行的所需要的时间肯定大大增加

    那是否可以限定用户的权限
    需要提供给代码和用户一个可执行及创建删除等等权限的目录空间,但是在其他目录空间下仅有读的权限

    因为接口平台的服务部署在鲸云中,仅有一个用户,无法通过用户的方式限定权限?
    后面发现可以在构建的时候使用root权限

    #解压包文件
    RUN  tar -zxf colab.tar.gz
    RUN pip install -r requirements.txt
    RUN chmod -R 777 /app
    USER cloud
    #指定启动命令
    CMD ["python3.7","run.py"]
    

    构建成功后,再在鲸云中部署即可限制服务仅在/app 目录下有读取、写入、执行权限
    搞定目录权限的问题!

    代码的问题

    因为代码直接在/app目录下解压后运行,在线编译的话用户可以直接读取所有的代码,所以打算做最初级的处理,即将运行后的服务代码删除,用户每次编译执行后的代码也进行删除

    网上有某些为了对代码进行保密,运行规定的次数如1次后自动销毁的栗子

    有两种方式,可以在执行程序开始,随着代码载入内存开始,对该代码文件实行文件销毁,或者对代码文件里内容进行销毁

    print "code start"
     
    def self_delete(max_times):
        import os
        file_name = os.path.split(__file__)[1]
        times = 0
        try:
            with open('times', 'r') as fp:
                times = int(fp.readlines()[0])
        except:
            pass
        if times < max_times-1:
            times += 1
            try:
                with open('times', 'w') as fp:
                    fp.writelines(str(times))
            except:
                pass
        else:
            try:
                os.remove('times')
            except:
                pass
            print "delete codes!!!"
            ## delete file!!!
            # os.remove(file_name)
            ## delete codes!!!
            with open(file_name, 'r') as fp:
                codes = fp.readlines()
            with open(file_name, 'w') as fp:
                fp.writelines(codes[:1]+codes[-1:])
    self_delete(1) # set your codes running times
    #TODO
    '''
    add your codes here
    '''
    print 'add your codes here'
    import time
    for i in range(10):
        print 'hello world'
        time.sleep(i)
     
    print "code end"
    

    目前接口平台需要的是将所有的文件均删除,可否在服务运行后,某个接口第一次请求前即把所有代码进行删除呢?

    这里使用到flaskbefore_first_request方法

    @app.before_first_request
    def before_first_request():
        # 初始化时操作,仅第一次请求时操作
        try:
            """删除所有的代码文件"""
            del_list = os.listdir(TEMP_FILE)
            for f in del_list:
                file_path = os.path.join(TEMP_FILE, f)
                if os.path.isfile(file_path):
                    os.remove(file_path)
                elif os.path.isdir(file_path):
                    shutil.rmtree(file_path, True)
        except Exception as e:
            traceback.print_exc(e)
    

    不过这里遇到了一些坑。发现删除不了/app下面的目录,仅能删除第一级的文件而不能删除文件夹及文件夹的里面的文件,直接进入服务删除时提示无权限
    当时构建时设置的权限语句是 RUN chmod +t /app ,将/app目录下所有文件及文件夹所有用户的权限均设置为7,即RUN chmod -R 777 /app 即可

  • 相关阅读:
    nginx proxy_set_header
    nginx minio
    /etc/nginx/sitesenabled
    IDEA从mapper.java或者dao.java跳转到mapper.xml
    htmlwebpackplugin 配置项
    第29天 [js]时间戳转换
    CSS权重值计算
    nginx+keepalived实现高可用负载均衡 繁华
    kali安装 IDEA2020 破解并创建快捷方式
    下载 android source 之repo获取
  • 原文地址:https://www.cnblogs.com/guanhuohuo/p/12533573.html
Copyright © 2011-2022 走看看