普通视图

发现新文章,点击刷新页面。
昨天以前Zikin的独立博客

修改 MacOS 系统底层时间

作者 Zikin
2023年8月14日 20:23

昨天发现 macOS Keychain Access 中的时间显示的是 China Standard Time (CST), 然而我的系统时区是 Asia/Singapore, 查到这个应该是系统底层的时区(暂且这样称呼), 似乎是根据是销售地区, 不知道是因为 Bug 还是因为 CST 本身不在 macOS 时区列表中, 激活设备后无论如何修改时区, 这里都不会被更改
(因为无法改回 CST, 下图以 Hong Kong Standard Time [Asia/HongKong]举例)

修改这个 “系统底层时区” 的步骤如下

首先打开 Shell (Terminal, 中文系统中叫终端机), 输入这个命令

ls /var/db/timezone/zoneinfo/

然后输入以下命令, 按要求输入当前登录 macOS 用户的登录密码 (非 iCloud 密码)

sudo ln -sf /var/db/timezone/zoneinfo/Asia/Singapore /etc/localtime

这里的 Singapore 可以替换成任意存在于上方输出结果中的时区

随后就能看到系统底层时区已经更改 (右图)

修改 MacOS 系统底层时间最先出现在Zikin 的独立博客

屏蔽 Censys 扫描器, 及设置仅允许 Cloudflare 回源

作者 Zikin
2023年7月12日 17:28

此文仅适合 Nginx 使用者.

Censys 是一个网络搜索引擎, 可以根据 IP, 端口, 以及域名搜索互联网上的服务器, 此项目的初衷是协助网络管理员发现并防御威胁, 并协助安全合规与研究, 但是与此同时, 这也意味着任何「暴露到公网」的项目都会被扫描到, 他人可以利用此引擎搜索到你的源站服务器并绕过 CDN / WAF 进行攻击. 这篇博客将介绍如何屏蔽 Censys 的扫描.

获取 Censys Scanner 所使用的 IP 范围

首先, 我们需要知道 Censys 使用哪些 IP 扫描互联网内容, 根据其官网披露的信息, 我们可以找到其所使用的 IP CIDR 为:

162.142.125.0/24
167.94.138.0/24
167.94.145.0/24
167.94.146.0/24
167.248.133.0/24
2602:80d:1000:b0cc:e::/80
2620:96:e000:b0cc:e::/80

如果担心这个信息不是最新的, 也可以去查询 Censys 的 ASN 下宣告的 IP, 其使用的 AS 为

将 IP CIDR 倒入配置文件

/etc/nginx/conf/ 下新建文件 censys-ips.conf, 写入以下内容

注: 请以 Nginx 的实际安装位置为准, 例如如果使用宝塔面板, 配置文件则应放置在 /www/server/nginx/conf/

# Censys IP CIDR
# https://support.censys.io/hc/en-us/articles/360043177092-Opt-Out-of-Data-Collection

# IPv4
deny 162.142.125.0/24;
deny 167.94.138.0/24;
deny 167.94.145.0/24;
deny 167.94.146.0/24;
deny 167.248.133.0/24;

# IPv6
deny 2602:80d:1000:b0cc:e::/80;
deny 2620:96:e000:b0cc:e::/80;

屏蔽 Censys

然后打开所要保护网站的 Nginx, 在 server 区块下添加以下内容

    #屏蔽 Censys
    include /etc/nginx/conf/censys-ips.conf;

例:

随后保存文件并且重载 Nginx

sudo systemctl reload nginx

(可选) 仅允许 Cloudflare 回源

如果你使用 Cloudflare 的 CDN, 你还可以选择使用相同方法仅允许 Cloudflare 回源, 禁止直接访问源站.

/etc/nginx/conf/ 下新建文件 cloudflare-ips.conf, 写入以下内容

# https://www.cloudflare.com/ips
# IPv4
allow 173.245.48.0/20;
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 141.101.64.0/18;
allow 108.162.192.0/18;
allow 190.93.240.0/20;
allow 188.114.96.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;
allow 162.158.0.0/15;
allow 104.16.0.0/13;
allow 104.24.0.0/14;
allow 172.64.0.0/13;
allow 131.0.72.0/22;

# IPv6
allow 2400:cb00::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2405:b500::/32;
allow 2405:8100::/32;
allow 2a06:98c0::/29;
allow 2c0f:f248::/32;

然后在站点的 Nginx 配置文件 Server 区块中加入以下内容

#只允许 Cloudflare 回源
include /etc/nginx/conf/cloudflare-ips.conf;
deny all;

如果将这两者结合:

#屏蔽 Censys
include /etc/nginx/conf/censys-ips.conf;
#只允许 Cloudflare 回源
include /etc/nginx/conf/cloudflare-ips.conf;
deny all;

此外, 如果你的服务器上所有站点都经过 Cloudflare CDN, 那你也可以直接在 Nginx 配置中写入以上内容, 这样服务器上的所有站点都只会接受 Cloudflare CDN 节点的入站流量, 且屏蔽 Censys.

屏蔽 Censys 扫描器, 及设置仅允许 Cloudflare 回源最先出现在Zikin 的独立博客

使用 Cloudflare Zero Trust 保护管理面板

作者 Zikin
2023年2月15日 00:40

Zero Trust (零信任) 是一个安全框架标准,要求所有用户在被授予或保持对应用程序和数据的访问权限之前,都要针对进行身份验证 —— 即对每一次会话进行验证

Cloudflare Zero Trust 是 Cloudflare 推出的 「零信任」平台,为每个团队提供 50 成员的免费订阅,我们可以将一些关键的网页放在 Zero Trust 后面保护。

创建团队

首先需要创建一个 Cloudflare 账号,并且绑定域名(至于改NS什么的应该不用教了吧)

https://dash.cloudflare.com/sign-up

然后进入 one.dash.cloudflare.com,点击左侧 Settings - General ,设置 Team Domain

添加 SSO 登陆方式

回到 Settings 页面,点击 Authentication,添加验证方式,支持的验证方式如右图所示,建议如果个人使用的话, Github + Google + OTP (One-Time Pin) 足矣,而且自认为属于最佳实践,添加每种验证方式的时候右侧都有详细的提示,按照步骤添加即可。

添加验证方式时候右侧有提示

设置登陆因素白名单

来到左侧菜单,Access - Access Groups - Add a Group,如果你刚才已经分别添加了 Github + Google + OTP (One-Time Pin) 的验证方式,那么可以按照如下方法设置白名单:

  • Emails ending in: 你的域名(如果你有域名邮箱的话)
    此处不要设置 gmail.com outlook.com 这类公众邮箱后缀,否则任何人可以被允许访问 Zero Trust 后的资源
  • GitHub Organization: 你账号所在的组织
    例如我的账号持有 @ZikinORG 这个组织,我在登陆时授权给这个登陆时候使用的 Github App 访问 @ZikinORG 组织信息的权限(只是让app知道你在这个组织里,app无repo和members权限),之后就可以用 Github 账号一键登录了
  • Emails: 其他你需要添加到白名单的账号
    你可以输入你的个人 Gmail,然后在登陆的时候选择 Google 登陆即可

添加需要被保护的域名 / 路径

来到 Access - Applications ,新建应用,在此处选择 Self-hosted

输入要保护的路径

  • 对于 Wordpress,建议保护 /wp-admin/wp-login.php (无需输入斜线,直接输入后面的部分即可,即 wp-adminwp-login.php )
  • 对于 Typecho 或 Bitwarden 等,保护 /admin 即可

其余设置保持默认,但请注意 Session Duration (会话过期时间) 这里不可以选择 expires immediately,否则如字面意思,发起请求的 Token 会立刻被 Revoke,这种情况下无法有效的拉起 ZeroTrust SSO

此时保存规则,应该就一切都已经就绪了,你可以打开你设置的路径查看效果。

使用 Cloudflare Zero Trust 保护管理面板最先出现在Zikin 的独立博客

更优雅的使用虚拟机

作者 Zikin
2023年2月12日 18:24

你是否有想过单独隔离一些你并不信任的软件到虚拟机中,但又因为感觉虚拟机来回切换页面不方便 / 只有一个显示器放不下两个系统的桌面而苦恼?我前段时间研究了下发现有一个解决方案还算完美,能让在虚拟机内的软件在实体机系统内有着类原生的体验。

Microsoft RemoteApp 是微软在 Windows Server 服务器系统上推出的解决方案,允许用户跨设备、跨操作系统的使用 Windows 软件,应用程序的本体和缓存目录全部存在于服务器上,但是却能做到类原生应用的体验。看到这里也不难看出这是一套企业解决方案,微软也确实没把这套解决方案下放到 PC 操作系统上,而在 Windows Server 上配置 RA 需要进行比较复杂的域配置,但是由于其是 Based on RDP 的,并不是什么复杂的完全闭源的私有协议,所以我们可以利用一款开源的软件 RemoteApp Tool 实现这一体验。

操作

创建虚拟机

这一步应该无需太多解释,创建一个虚拟机即可,如果只是放几个聊天软件啥的,内存 8GB 就够了,建议的 Windows 版本为 Windows 10 LTSC 或 Windows 10 Pro 22H2 (Edu/Workstation 也可以)。

用了两个多月的虚拟机内系统

配置虚拟机系统的时候建议断网,创建本地帐号;不要使用 Windows 11 否则你会变的不幸

覆盖 RDP 配置以支持多用户登录

(可选,若只自己使用则不需要)

前往 Github 下载 stascorp/rdpwrap 的最新版本,解压缩后以管理员权限运行 install.bat , 这个脚本会在配置完成后自动重启 RDP,如果 Hyper-V 的虚拟机连接被断开,重新开启即可。

随后以管理员权限开启 RDPConf.exe,如果此处全绿的话进行下一步,如果不是的话说明 rdpwrap 默认的配置文件无法破解掉当前系统版本的 DLL 文件,需要升级 rdpwrap.ini 文件:

打开 sebaxakerhtc/rdpwrap.ini 下载最新版本,覆盖 rdpwrap 根目录的 rdpwrap.ini,然后重新管理员权限运行 RDPConf.exe

RDPConf.exe 全绿

配置 FRP

因为虚拟机并没有取得独立IP,所以需要在你家的 NAS 或 PC 上开启一个 FRP 服务端 (FRPS),在 https://github.com/fatedier/frp 下载配置文件后分别解压到虚拟机和服务端,编辑配置文件 frps.ini ,保存后启动。

[common]
bind_addr = 0.0.0.0
bind_port = 7000

# Virtual host configuration
# vhost_http_port = 8080
# vhost_https_port = 8443
# vhost_udp_port = 13389 

//如果用NAS的话可以直接用3389端口,这里用13389是防止和PC冲突,保存配置文件时这行注释需要删掉

# Dashboard configuration
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = <id>
dashboard_pwd = <passwd>

# logs
log_file = ./frps.log
log_level = info
log_max_days = 3

# auth token
token = <auth_token>

max_pool_count = 5
max_ports_per_client = 0
authentication_timeout = 900
tcp_mux = true

然后在虚拟机内编辑 frpc.ini,如下,保存后启动

[common]
server_addr = <NAS或PC的IP>
server_port = 7000
token = <auth_token>

pool_count = 5
tcp_mux = true
user = your_name
login_fail_exit = true
protocol = tcp
dns_server = 8.8.8.8

[rdp]
type = udp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 13389

[rdp_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 13389

配置 RemoteApp

管理员权限打开 RemoteApp Tool,左下角选择程序的主文件(非快捷方式),例如我这里添加了 Edge 作为演示的软件 C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe,然后单击 RemoteApp 列表的 Edge 图标,点击右下角 Create Client Connection,在地址那里全部填写 FRPS 服务端的设备 IP 即可,比如我的服务器在内网中是 10.10.1.1,映射的 RDP 端口 13389,然后单击 Create 保存配置文件,把配置文件复制到实体机;配置文件内容如下图所示,双击即可运行。

至此你就可以正常的使用 RemoteApp 了,但是还有两个问题,一个是由于系统限制,状态栏(不是任务栏,而是在任务栏右侧显示的那些小图标)上的图标无法点开,一个是 FRP 没有后台运行也没有开机自启,解决方法如下。

完善打开方式

先说任务栏图标,这个无解,但是你可以把远程应用 RDP 配置文件命名成一个你记得住的名字,然后用 ListaryFluent Search 这样的快捷搜索软件设置好快捷点,输入软件名直接打开,效果如下。

我为了让搜索时候显示图标,设置了一个图标为软件 icon 的快捷方式指向配置文件,效果如左图,如果你懒得设置的话,又是右图那种效果。实际体验都一样,毕竟你又不天天盯着搜索页面看;任务栏上和状态栏里显示的图标是正常的,无需单独设置。

FRP 开机自启

新建一个 vbs 文件,命名为 frp.vbs,内容如下(盘符为小写,替换成你自己的 frp 文件位置),然后把这个文件复制到 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 即可;这个是 frpc (虚拟机内) 的,如果是 frps (NAS或PC上的服务端),把配置文件中的 frpc 替换为 frps 即可(注意 exe 和 ini 都要换)。

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "c:\FILES\frp_0.45.0_windows_amd64\frpc.exe -c c:\FILES\frp_0.45.0_windows_amd64\frpc.ini",0

一些建议

  • 建议把虚拟机的 Windows Explorer (文件资源管理器) 和 RemoteApp Tools 面板,以及你常用的浏览器、代理软件都制作成 Remote App,方便管理虚拟机内的资源。
    其中前两者路径一般为
    C:\Windows\explorer.exe
    C:\Program Files (x86)\RemoteApp Tool\RemoteApp Tool.exe

结语

我自己用这套方案已经两个月了,平时用起来很舒服,几乎就是原生应用的体验,最近终于有时间把教程写出来了,希望大家可以保护好自己的隐私。

如果你在操作过程中遇到了什么问题的话,欢迎写 Email 给我 ( i@zikin.org ),或直接去使用到的几个开源项目的 Repo 提 issue。

本期使用到的开源项目列表

更优雅的使用虚拟机最先出现在Zikin 的独立博客

如何确保源站 IP 不会因为证书而暴露

作者 Zikin
2022年12月27日 10:06

证书信息是如何泄露源站 IP 的

当你对服务器请求了一个服务器上不存在的域名时,服务器会在你的 http 和 https 端口分别返回「默认站点」或「最后一个添加的站点」的数据,其中就包括证书 (会提示不安全,因为SNI不一致,但可以看到证书内容,其中包括域名),下图中 Subject: CN=***** 就是你证书的 SNI,也就是域名,例如下面这张图,此人把服务器面板的 SNI 暴露了出来;由于 Shodan , Censys 这种长期扫描互联网空间的服务存在,直接通过域名找到你 IP 的难度很低

CN = Common Name / 公用名称,对于 TLS 证书就是域名,对于代码签名证书就是组织信息

shodan.io
sensys.io

解决思路

解决这种问题有至少四种办法

  • 生成一张假的证书,写上假的域名
  • 使用不受主流浏览器支持的证书算法,导致浏览器无法握手(?
    Koori 想到的,可参考她的文章
  • 默认网站使用 IP 证书
  • 默认网站替换换为 Nginx 或 Apache 的默认页,伪装一个还没部署网站的新服务器,不会暴露证书,也不会很起眼

最简单的应该是第四种,如果您有一定技术能力且爱折腾,第一种和第三种方式也不错,至于如何生成自签名证书,可以查看本站另一篇文章 《XCA简易入门教程

设置方法

下面分别介绍原版 Nginx 和使用某面板的情况下的设置方法

原版

# nginx.conf

server {
listen 80 default_server;
server_name gofxxkyourself.sb;
...
}
# /www/wwwroot/gofxxkyourself.sb/index.html

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

宝塔面板

  • 新建一个网站,域名随意,纯静态,无数据库
  • 更改默认网站
  • 把网站暂停
  • 修改默认页 - 站点停止页
  • 替换为以下内容
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
  • 再访问就可以看到 (伪装成的) Nginx 初始页了
需要注意的是,有的时候使用 https 访问这个 IP 的时候,Nginx 可能使用其他部署在本服务器上网站的证书,你可以替换一张自签名证书给这个域名以解决此问题,详情参考 zikin.org/xca

至此,应该可以防止大部分情况下的源站 IP 泄露了。

如何确保源站 IP 不会因为证书而暴露最先出现在Zikin 的独立博客

❌
❌