在宝塔上有对目录加密的功能,但在appnode上只有对整站加密的功能。需要修改源文才能单独加密admin目录。

或许有人说修改admin目录名称一样安全,但我随便搜了下,有人发现typecho修改了admin目录名称后反而出现了漏洞,虽然有办法解决,但更麻烦了。

因此我决定在appnode用nginx的ngx_http_auth_basic_module模块实现让用户只有输入正确的用户名密码才允许访问admin目录,来加密typecho的登录目录。

这个文章算是appnode加密typecho的admin目录全网首发吧。

appnode安装完成后自带htpasswd工具,因此可以直接使用

htpasswd -c /data/basic/sites/vhost/conf/passwd admin
New password: 
Re-type new password: 
Adding password for user admin

来创建密码文件。
其中
/data/basic/sites/vhost/conf/passwd内的conf为appnode为每个网站(比如这里的vhost)单独创建的conf文件存放位置,所以我也把密码文件放这里了。
admin为用户名,可以自己设置。
New password为登录密码,需要输入两次,建议不要和typecho的密码重复。

使用:cat /data/basic/sites/vhost/conf/passwd能看到admin:{SHA}xxxxxxxxx,密码已被sha加密了。

前往网站设置-源文,自定义添加:

location /admin {
  auth_basic               "Admin Auth";
  auth_basic_user_file     /data/basic/sites/blog/conf/htpasswd;
  index                    index.php;
}

location ~ ^/admin/.+\.php(/|$) {
  auth_basic               "Admin Auth";
  auth_basic_user_file     /data/basic/sites/blog/conf/htpasswd;
  # [这部分照抄 APPNODE 中 ^/.+\.php(/|$) 的配置]
}

location ~ ^/(index.php/)?action/login {
  auth_basic               "Admin Auth";
  auth_basic_user_file     /data/basic/sites/blog/conf/htpasswd;
  # [这部分照抄 APPNODE 中 ^/.+\.php(/|$) 的配置]
}

即可。

重启PHP、NGINX,用重载可能不会正确生效

之前我没加 index index.php;导致网页一直认为/admin/是目录,从而导致403,经过提普ucw的提醒,和我的测试,最后得到了这个配置。
使用index index.php;指定网页默认文档加载index.php

上面的配置是最新的配置
旧版的配置location /admin/会被加参数绕过,也无法防御POST攻击

/admin/write-post.php?cid=1

而这个新版的配置即使是加了参数也绕不过去,还是得输入nginx密码。

经过测试,chrome自动填写密码能正确区分不同界面使用不同密码,并且,即使通过Cookie登录了后台,访问后台时依然需要输入nginx的密码才能访问。在两处密码不一样的情况下,基本上防御了普通暴力破解的攻击。

感谢UCW大佬提醒

最后修改:2020 年 04 月 14 日
如果觉得我的文章对你有用,请随意赞赏