depy

It is a long and beautiful life.

折腾笔记-宝塔面板登陆加固

体验

前言

我是一个安全感极低的人,所以我基本不用什么开源的框架和代码。如果是我自己开发的项目有了漏洞,我也就认了T_T。

我用的是宝塔面板做运维和部署,因为真的很好用,下午上课很无聊,想着折腾一下,让面板登陆变得更加安全。

宝塔的面板登陆

传统的面板输入登陆端口后会访问到一个界面

606ec0ff8c665.png

所以首先把它删掉,并且替换默认端口为奇怪的不常见数字

但是总是会被nmap这类工具扫描出来的,所以宝塔有一个安全入口功能,可以设置的奇怪一点

发现登陆界面有个扫码登陆功能

606ec17479dbd.png

也赶紧删掉,也不在宝塔面板绑定自己的账号

基础上加固

访问文件

/www/server/panel/BTPanel/__init__.py

这是一个宝塔面板的初始化文件,用到的是flask框架。

我们搜索路由/login,找到相关的代码

606ec1ed7d34f.png

首先会检测一个pl文件判断面板是否安装,否则就判断安全入口,然后成功的安全入口会写入session中,使得访问过安全入口的人下次访问login也可以访问到登陆界面

于是设想做一个类似token的鉴权来做进一步的防护

  1. 使用一个GET参数,类似pass这样的字段获取内容,然后与密码比对,不正确就跳转或者报错

  2. 密码来源可以是固定格式也可以通过远程接口,例如我给我博客加了一个配置,设置成了接口,这样就可以动态的更新访问密钥

  3. 同理,密码参数也可以通过远程获取

动手写代码:

以硬编码为例子,首先定义一个key。

depy_key = "depy"

flask框架中,获取form表单内容的方法是:request.form.get(v, '').strip()

而我们这个是从请求的get参数获取,写法是login_key = request.args.get("参数")

最后在进入界面之前做个判断,代码是:

if depy_key != login_key : return public.returnMsg(False, depy_key==login_key), json_header

成果

606ec3f32d4f3.png

606ec461903c9.png

606ec489915b8.png

配置远程获取参数和密码

首先呢,先在博客配置写两个东西

606eca3a432f1.png

然后去接口控制器写代码 就OK

606eca82f2fe6.png

这里设置了的是 depy 和depy@12345 就不重新截图了 刚刚没有写内容

访问宝塔面板登陆

606ecb2738d4f.png

发现成功访问 此时修改我们的btpass

606ecb549bc13.png

再刷新就不能进入登陆界面了,成功为我的宝塔面板加了一层防护,并且实现博客联动。