执行用户代码在线编译或者函数调用,必须要考虑到安全性的问题,因为用户的脚本嵌在后台服务中运行,用户的权限和服务的权限是一致的,如何做到安全或者说尽量降低用户的破坏带来的风险
文件安全的问题
是否可以使用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"
目前接口平台需要的是将所有的文件均删除,可否在服务运行后,某个接口第一次请求前即把所有代码进行删除呢?
这里使用到flask
的before_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
即可