在服务器上有时候需要安装一些软件,但是下载地址被 GFW 给墙了。手上只有 Shadowsocks 可以用,所以研究了下怎么在服务器上用起来。只需要用到 Shadowsocks 的命令行客户端启动一个 SOCKS 代理,然后用 polipo 转化成 HTTP 代理,就可以通过环境变量 http_proxyhttps_proxy 在命令行中使用代理了。

最近已经把 Bear 作为自己的主力笔记应用了,之前是同时用 Day OneUlysses 。Ulysses 还会偶尔用到导出和发布到 Medium 的功能,以及 把富文本或者网页上内容转成 Markdown ,Day One 基本上不用了。

Day One 和 Ulysses 都是很优秀的笔记应用,但是都会有一些不符合我使用需要的一些地方,导致不得不两个一起用,形成互补,但是内容分散在两个应用里还是非常不方便。而 Bear 的出现基本满足了我的需求。

UCloud API 需要把所有请求参数拼接起来进行签名。在 Paw 中测试 API 时可以添加 URL Params 参数 Signature,使用 JS Script 的 Dynamic Value 进行拼接,组装上 private key 之后再用内置的 SHA1 就能得到最终的签名了。

拼接使用的 JavaScript 代码如下:

// context docs: https://paw.cloud/docs/reference/ExtensionContext
// request docs: https://paw.cloud/docs/reference/Request

function evaluate(context){
    var req = context.getCurrentRequest();
    return req.getUrlParametersNames().filter(function(k) { return k != "Signature" }).sort().map(function(k) {
        return k + req.getUrlParameterByName(k);
    }).join("");
}

Paw 会提示 URL Params 使用 JS Script 会有递归依赖的问题,忽略掉就可以。不过注意在上面的 JavaScript 代码中需要跳过 Signature 参数。

最近看到一篇文章详细说明了如何通过 Redis 获得 SSH 登录权限。简单来说就是如果 Redis 开放了外网端口访问,又没配置防火墙,也没有配置任何 Redis 的连接验证,而且还是用很高权限的用户在运行 Redis,就可以通过 dump 数据库把任意 key 注入到 authorized_keys 文件中,从而获得用户的 SSH 登录权限。条件很苛刻,但是很容易自动化,估计还是可以扫描到不少肉鸡的。

比较惭愧,最近部署的一台服务器就被该方法攻击了。主要原因是之前我已经书面说明了防火墙如何配置,所以想当然的认为拿到的机器已经配置好了。为了让 Redis 在内网内能访问,配置脚本中将监听的地址改成了 0.0.0.0,也没有配置连接验证,结果就是任何人都能连接上这个数据库。不过因为还是用的单独的 redis 用户运行,权限有限,攻击者并没有拿到 SSH 登录权限,只是把数据库清空了。所幸是测试服务器,数据库中的数据并不重要。

下面说明下我所了解的保护服务器安全的一些常识。