Logo

site iconMoreality

偏个人软、硬件开箱记录的博客
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Moreality RSS 预览

数据安全:一次 VPS 宿主机被入侵的事件记录

2024-10-25 11:36:58

即使是一个经营了长达 11 年的商家,还是会出现整台 VPS 母鸡被黑客入侵的情况。

并且令人感到愤怒的是,商家还对此做了隐瞒,不愿意承认是被入侵并泄露数据,而把责任归咎于是 RAID 出现故障。

经过这次事件,我再也不想去相信中小厂的公有云服务了。

强烈建议,在任何 VPS 部署服务时,做好 数据加密存储,并不在服务器上存储任何明文的 token 或密码

以及,及时的备份数据

事件经过

1 - 系统宕机和绿云工单回复

  • 2024-10-21 16:24

我发现一台在线时长将近一年的绿云 10 周年 VPS 自动重启了。

当时没太在意,以为就是例行维护。

随后我发现我的一些需要写入数据库的服务变得不可用,比如 seafilevaultwarden

登录上服务器发现文件系统全部变成了 read-only

于是我发了一个工单:

发工单后,我发现服务器直接宕机了,并且通过 SolusVM 面板无法进行重启。

  • 2024-10-21 18:16

绿云客服回复,说是遇到了罕见的 RAID 故障。

当时我认为,这种便宜的机器也许就是 RAID0 吧,如果修不好可能数据就没了。

不过好在做了备份。

  • 2024-10-22 17:29

经过了一天的时间,发邮件询问情况。

绿云客服回复,RAID 无法恢复,只能 rebuild。

补偿是 1 年时间,或者按照购入价格全额退款。

2 - 商家的隐瞒

  • 2024-10-23 lowendtalk 网友发帖,披露 VPS 数据被入侵。

原贴地址:https://lowendtalk.com/discussion/198766/my-greencloud-vps-got-ransomwared-the-entire-mothership/p1

该网友进入了救援模式 (Rescue Mode)[1]后,可以看到所有的文件都被修改成了 [email protected]

我在进行相同操作的时候,确实也发现了,所有的文件都被 改名并加密,直接 google 搜索 junglesec,可以发现这是一个黑客组织,主要以勒索攻击(ransomware)而闻名。[2]

究竟发生了什么

搜索一下关键字 junglesec, VPS, IPMI,就大概可以看懂是数据是如何被入侵的了。

IPMI(智能平台管理接口) 是一种集成在服务器主板上的系统管理固件,这种固件允许管理员在操作系统无法访问时仍能进行远程管理,例如重启系统、查看系统状态等。因此,IPMI 提供了对系统的深层次访问权限。

本次服务器攻击的步骤

  1. 通过 IPMI 登录获取访问权限

    • 攻击者首先寻找启用了 IPMI 的设备,特别是那些使用默认密码未充分加固的 IPMI 接口。

    • 一旦攻击者登录成功,就可以通过 IPMI 远程控制服务器,即使系统的操作系统崩溃也能进行操作。

  2. 重启系统进入单用户模式

    • 攻击者利用 IPMI 的远程访问功能,将目标服务器重启到单用户模式(Single User Mode)。在这个模式下,系统只加载必要的服务,并为管理员提供 root 权限,而无需输入密码。
    • 攻击者在单用户模式下可以绕过所有用户账户的认证机制,直接获得系统的最高权限。
  3. 下载并编译加密程序

    • 获得 root 权限后,攻击者在系统中下载并编译一个名为 ccrypt 的加密程序,攻击者利用它来加密系统中的所有文件。
  4. 发送勒索邮件

这并不是一个比较新鲜的攻击方式了,可以看到非常多的相关案例[3][4]

我们应该做什么

在事件发生之后,我选择了退款 + 重新迁移数据到阿里云。

同时,由于之前过于相信商家 + 懒惰,很多备份的脚本和一些其他的定时任务,比如 vps 之间的 ssh 鉴权,比如许多上传和下载的 api key 和 token,我都明文保存在了 VPS 上。

因此,我重置了一些重要平台比如 google drive, onedrive, github, gitlab 的 auth token,同时清理了所有 vps 上的 authorized_keys

还好目前部署的东西大多是玩具,这是一次很好的教训,之前用云服务的时候其实一直忽略了数据安全和隐私,觉得许多事情离我太遥远,然而当事情真正发生到自己身上时,再后悔就晚了。

一个很容易想到但是许多人压根不 care 的事情是,只要你的文件是明文存储的,那么 vps 厂商就可以读到你的明文文件。[5]

因此,当 vps 宿主机出现被入侵时,你的文件也可以被其他人明文读取

所以,最好的防护措施是:

  1. 尽量只用大厂服务。
  2. 敏感信息不上云,上云就做好端到端加密和及时的备份。
  3. 不要在 vps 的一些 cronjob 中明文配置一些密码和token。
  4. 真正重要的基础服务还是不要自建,或者采用更鲁棒的方式比如做 k3s 之类的集群,否则关键时候出问题,即使有数据备份恢复起来还是很麻烦。

相关概念

1 - rescue mode

救援模式(Rescue Mode)是虚拟专用服务器(VPS)提供的一种应急维护功能,允许用户在无法正常启动系统或发生重大问题时,进入一个最小化的操作环境进行排障和修复。它通常是一个轻量级的 Linux 环境,不依赖原有的操作系统,类似于单机版的安全模式或Live CD。

2 - junglesec

JungleSec 是一个黑客组织,主要以勒索攻击(ransomware)而闻名。该组织的活动在网络安全圈中引起了广泛关注,其主要手段是针对企业或个人的系统进行未授权访问,并通过加密文件或劫持网络基础设施实施勒索。

主要的攻击方式

  1. 勒索软件攻击
    JungleSec 通常在侵入目标系统后,将关键文件加密,并要求受害者支付赎金(通常以比特币等加密货币支付),否则威胁删除或公开敏感数据。
  2. 攻击向量
    他们利用系统中的已知漏洞弱密码、以及未充分配置的管理接口(如 IPMI,BMC)等来侵入系统。IPMI(Intelligent Platform Management Interface)是他们的主要目标之一,这是一种用于远程管理服务器的接口,如果未安全配置,就容易被攻击者利用。
  3. 赎金要求
    JungleSec 的攻击一般要求受害者支付一定金额的比特币或其他加密货币。如果不支付,受害者的数据将无法解密。

ref

Blelloch 并行扫描算法

2024-10-18 21:31:32

本文是对这篇 博客 的一些补充和 python 代码实现

前缀和 (PrefixSum) 和扫描 (Scan)

在并行计算中,前缀和(prefix sum)被称为“扫描”(scan)主要是因为这个操作的本质涉及对一个序列中的元素进行累积或递推计算,类似于扫描或遍历序列。

其特点是,输出的每一个值有前缀依赖性,就是说每个输出依赖前面的所有输入。

1
2
3
4
5
# input:
[a0, a1, a2, a3, ..., an]

# output:
[a0, (a0+a1), (a0+a1+a2), ..., (a0+a1+a2+...+an)]

Blelloch 并行扫描算法

Blelloch 扫描算法(Blelloch scan algorithm)是一种高效并行实现前缀和(prefix sum)操作的算法,通常用于大规模并行计算中。

这个算法采用了一种基于二叉树的并行计算模式, 将传统的 O(n) 求前缀和的复杂度减少为 O(log(n))

Blelloch 扫描算法由两个主要步骤组成:

  1. 向上(Upsweep)阶段
    • 该阶段是通过一棵隐含的二叉树自底向上构建累积和。
    • 在此过程中,每一个节点汇聚子节点的值。
    • 经过 log(n) 次迭代,最终根节点处存储了整个数组的总和。
  2. 向下(Downsweep)阶段
    • 在这个阶段,算法从树的根节点开始,自顶向下计算前缀和,同时传播累积和到子节点。
    • 在每一层中,左子节点继承父节点的值,而右子节点加上父节点的值。

具体可以参考这个图:

这里用一个 python 代码来展示每一步的具体过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def blelloch_scan(arr):
arr = list(arr)
n = len(arr)

print("Initial array:", arr)

step = 1
print("\nUpsweep Phase:")
while step < n:
for i in range(0, n, 2 * step):
if i + step < n:
arr[i + 2 * step - 1] += arr[i + step - 1]
print(f"After step size {step}, array: {arr}")
step *= 2

arr[-1] = 0
print("\nSetting root to 0, array:", arr)

step = n // 2
print("\nDownsweep Phase:")
while step > 0:
for i in range(0, n, 2 * step):
if i + step < n:
temp = arr[i + step - 1]
arr[i + step - 1] = arr[i + 2 * step - 1]
arr[i + 2 * step - 1] += temp
print(f"After step size {step}, array: {arr}")
step //= 2

return arr

input_array = [1,2,0,1,2,0,1,2]
arr = blelloch_scan(input_array)
prefix_sum_array = [input_array[i] + arr[i] for i in range(len(input_array))]

print(f"\nFinal PrefixSum array: {prefix_sum_array}")

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Initial array: [1, 2, 0, 1, 2, 0, 1, 2]

Upsweep Phase:
After step size 1, array: [1, 3, 0, 1, 2, 2, 1, 3]
After step size 2, array: [1, 3, 0, 4, 2, 2, 1, 5]
After step size 4, array: [1, 3, 0, 4, 2, 2, 1, 9]

Setting root to 0, array: [1, 3, 0, 4, 2, 2, 1, 0]

Downsweep Phase:
After step size 4, array: [1, 3, 0, 0, 2, 2, 1, 4]
After step size 2, array: [1, 0, 0, 3, 2, 4, 1, 6]
After step size 1, array: [0, 1, 3, 3, 4, 6, 6, 7]

Final PrefixSum array: [1, 3, 3, 4, 6, 6, 7, 9]

ref

记一次 mac 剪刀脚键盘的修复

2024-10-15 13:28:27

背景

感觉方向键里进了什么东西, 然后就直接把 mac 键盘的方向键翘起来清理了一下内部, 然后就发现装不回去了…

由于之前也有过拆 mac 键盘的经验, 拆过很多次正方形按键 (字母, 数字键), 都是翘起来, 然后按回去就行了, 于是这次没有多想就直接把方向键也这么操作了, 然后发现怎么都按不回去.

最后参考了 b 站的这个视频: Macbook 剪刀键盘方向键键帽安装 才发现事情没有那么简单.

剪刀脚的方向键和 mac 其他的正方形的数字按键不同, 这玩意拆了键帽不把剪刀脚支架一起拆下来, 强行是 压不回去的.

由于大力按压, 键帽的左边的卡扣已经压断了, 只能上 PDD 新买一个键帽. (这玩意一个就是几十块.)

操作

最后记录一下 mac 上方向键的结构和安装步骤, 图片来源: 小红书

注意 Step7 这一步特别难操作, 建议用一个镊子或者别针之类的东西, 卡住支架的右侧, 然后把左边挂上去, 总之 切忌用蛮力!

总结

以后拆任何电子产品都得小心了, 尤其是那种做工比较细节的, 可能相似的部件设计却完全不同, 然后不提前看看结构大力出奇迹就悲剧了.

日常的缝隙 —— 「观察的艺术」阅读笔记

2024-10-05 00:02:34

国庆没有出去看人海的计划,于是阅读了不少影视和书籍作品,其中有「观察的艺术」[1]这本书给我留下挺深刻的印象。

个人觉得这是一本值得反复观看的书,真的以很实用的阐述方式,为一成不变的日常人生提供了很多不同的观察角度。

许多时候,总是感觉一件事就这么发生了,然后产生了一些情绪影响,却没有去仔细想过,究竟是什么东西让我产生了这种感觉。这本书的一个很大的价值就是,用了一系列非常细节的情景描述 / 方法论,说明了一个简单的道理:

视觉、声音、气味、体感、时间、温觉,人的感觉远远不止五感,但一切都是值得仔细体验和观察的。

这本书其实给了我一些对于「应该或者不应该」做什么的指示,很多时候我觉得我的脑回路不被人理解,比如在某个地方干着与这个地方气质不相干的事情,但是这本书肯定了我的一些行为,告诉我「其实这么做也是另一种思路和角度」。

一些书摘

由于文笔有限,在此记录一些书中个人觉得很有价值和思考的文字。

生命中,你总是有各种各样逃避的借口,种种责任纷至沓来,让你无比疲惫,这些都会限制你人生的宽度。但人生的全部意义就在于,尽自己所能从外面的世界获取最多的东西。世间之事,全在用心。你的注意力就是你的生命力。它让你和他人产生联结,让你感到渴望。保持渴望,保持同他人的联结,在平凡的日常中寻找自己感兴趣的事,留意别人忽视的东西——这些技巧一般人很难做好,但却十分重要。

睡觉前,她会聚精会神地听,努力分辨出每一种噪声:远处的狗叫声,空调的嗡嗡声,一辆车驶过的声音。

有一次,我和妻子在一所当代艺术博物馆闲逛时,走进了一个小厅,里面除了两个大木箱,什么也没有。这两个箱子令我困惑,因为不确定里面是装满了等待拆箱的艺术品,还是它们本身就是艺术品。

如果你想看见过去没有留意到的东西,向上看,便是一个很棒的选择。对初学者来说,你只需要不时地把视线从手机上移开,抬起头向上看。朝着不在正前方、却在上方的事物,抬起你的眼睛。

你不必到世界的另一头,也能找到新的地方进行探索。翻翻地图,想想哪里是你完全不熟悉的地方,然后给自己安排一次愉快的漫步。

你不太可能发现世界历史遗迹和名胜古迹。你想要寻找、吸收和享受的,是更普通、更日常的细节——一个有创意的商店标志、一盘偏离正轨的棋局、一座随意而迷人的教堂、一辆停在路边的古董车、一个碰巧骑着独轮车的路人。

“步行、骑自行车或开车——走不同的路线,去往一个相同的目的地。”他说,“如果你每天都以同样的方式通勤,你就不会注意到任何事物。事实上,到达目的地几分钟后,你就已经对整个旅程毫无印象了。进入这种僵尸般的通勤状态,实际上是在偷走你自己的时间。而新的路线能使旅行更加活跃和有趣。

一些碎碎念

这些日子特别喜欢看 Links[3] 的视频,最近看过的印象很深的一个视频就是冰岛徒步[4]的这一段:

在这里 links 和小螃蟹遇到了一个徒步的法国小哥。

特别喜欢这一段对这个小哥的描述,想到了书中的一段话:

并不是在否认拍照和自拍这些行为,而是有些时候,也许我们真的过于追逐打卡式的游览和带着目的任务,而因此不断丧失观察力和专注力。

“世界是一座博物馆,”他说,“你就是讲解员。”

reference

北戴河-秦皇岛之行

2024-09-24 12:39:57

人的心境也真是够滑稽的了。因为它会无可救药地被鸡毛蒜皮的日常生活所左右,却也能在风的感触与初夏气息的撩拨下心花怒放。人心是那么深奥,却也浅薄得不可思议。人之所以能活下去,也一定有这份浅薄的功劳吧。

——「旅行之木」

北京到秦皇岛是非常划算的出行计划之一,绿皮车票只要不到 50 元,现在正值淡季,各个旅游景点也都没有什么人,除了晚上的天气很冷之外,北戴河各方面都是相当完美。

总结一下旅行日志 + 在本文中详细把自己的行程安排记录下来。

准备工作

  • 门票:可以用「北戴河全域旅游」小程序,基本上可以直接在里面购买所有景区的门票,而且比单独在景区公众号 / 线下购买要便宜,可以直接刷码进入,不需要身份证。
  • 车票:建议买到北戴河站的火车,如果没有可以买秦皇岛站的,不过市区过来比较远(公交1h左右)。但是两个车站都有直达景区的公交车,淡季不怕没座位。
  • 景区出行:北戴河区没有共享单车,有专门的景区自行车,基本每个景点门口都有。不过还是强烈建议租一个电动车,大约50元 / 天,可以骑100多km,秦皇岛比想象中的小很多,实测北戴河转三四圈 + 骑到海港区(市区)一个来回都绰绰有余。

行程安排概要

由于只有两天,我的计划就是直接逛完北戴河区 + 海港区,此外山海关太远,阿那亚太贵,就没有去。

  • 第一天:联峰山 (15:00) - 老虎石 (17:00) - 环海公路 (18:00) - 秦皇小巷 (19:00)
  • 第二天:鸽子窝 (5:00) - 碧螺塔 (9:00) - 海滨骑车 (10:30) - 秦皇小巷 (12:00) - 西港花园 (14:00) - 金梦海湾 (16:30)

1 - 联峰山

下午两点到的酒店,先是出发去老虎石转了一圈,感觉没有什么特别值得逛几个小时的景点,于是就去了附近的联峰山打算登高望远一下。

联峰山有好几个山峰,其中望海亭可以看到北戴河区全景 + 大海,爬上山顶大概只需要 20min 左右。

2 - 老虎石

老虎石是一个绝佳的欣赏日落的地方,可以提前查好当天的日落时间,然后提前 30min 左右爬上石头等着。

从整个太阳落下去到天呈现蓝粉色大概就 10min 左右的时间。

不知道为什么博客的图片压缩好像有问题,HDR 图片居然被压缩出这种环形波纹了。。

3 - 环海公路

这条路就是老虎石旁边 50 m 处的一个公路,实际能看到海的路段没有很长,就几百米的样子。

不过蓝调时刻这个路段真的很美。

4 - 夜市:秦皇小巷

夜市在刘庄和秦皇小巷纠结了一会,看刘庄夜市风评一般,就直接骑着小电驴来海港区的秦皇小巷了 (30min),个人体验相当好,物价不算太高(和北京比起来),味道也很好。

于是第二天的午饭 + 晚饭也都是在秦皇小巷吃的,把几个比较火的小店都打卡了一遍。

5 - 鸽子窝

早上 5 点就起来去鸽子窝看日出了,由于酒店就定在鸽子窝旁边,走过去相当方便,同时鸽子窝这块也是距离海港区最近的,比较建议酒店定在这。

5 点的北戴河气温只有 8 度,我提前看了天气预报,带了一件毛衣过来,还是很冷。

练气功的大爷

老虎石看日落有一点远处的山和房子挡着,相比之下鸽子窝就是纯纯的正对一望无际的大海。

日出的速度比日落更快,能肉眼感觉到太阳一下就钻出来的感觉,大概全程也就几十秒的时间太阳就冒出来了。

6 - 碧螺塔

这里是北戴河一个人造味最浓的景区,也诞生了不少的网红打卡点,即使是淡季每个打卡点排队的人都很多。

晚上这里有演出,还有很多卖夜宵和啤酒的店,想必是相当热闹,不过白天都没开门。

票价也很贵,白天观光票就要 50,晚上好像要 180,不过如果要拍人像的话,这里确实挺值得来的。(在这里不拍人比拍人更难~)

7 - 西港花园

西港花园(开埠地)是秦皇岛老港口,后面废弃以后改造成了旅游景点,门票也是免费的。

个人非常喜欢这里的景色,相比碧螺塔那种人造景观,感觉这里的工业风更加真实且浪漫。

从大码头到海誓塔那一段路真的非常漂亮,左边是大海和许多航行的帆船、货轮,右边可以看到秦皇岛的整个城区海岸。