又一个wORdPRess站点

被害妄想症如何保护服务器安全

自从有次过海关的时候电脑被TSA开包检查硬盘还掉下来了之后,我的被害妄想症就越来越没救了。

这篇文章假设有人可以物理接触你的电脑,以及你所在的网络不可信,这种情况下应该怎么保护你的服务器数据安全。

 

  • 使用代理登录SSH以隐藏服务器IP。如果有多台服务器,选择一个位置最近的做跳板机,加密它的文件系统(OpenVZ再见)。设置另外机器的hosts.deny和hosts.allow为仅允许跳板机IP登录;如果使用不支持tcpwrapper的服务如dropbear,需手动设置iptables。
  • 登录跳板机的方式要和登录另外机器的方式不同。
    • 使用密码+google authenicator登录跳板机,然后通过公钥登录别的机器。设置跳板机的sudo需要密码,且设置为不同于当前账户的密码;方法是在/etc/passwd中添加一行toor:x:0:0:root:/root:/usr/sbin/nologin,使用passwd修改toor的密码,在/etc/sudoers中添加一行Defaults        runas_default=toor, runaspw。
    • 使用密钥A登录跳板机,使用另一个密钥B登录别的机器。密钥B应保存在本地,通过ssh-agent转发到跳板机。不同设备上的密钥B可以设置不同的passphrase。dropbear不支持ed25519,而ecdsa据都市传说可能存在NSA的后门。
  • 每三个月更换一次密钥。
  • 保证密钥的passphrase的强度;不使用任何云服务保存密码和密钥;如果设置记性太差,在本地AES加密一次,然后做好伪装(比如将二进制密文附到图片文件之后或压缩文件之前,[密文|!Rar…] 或 [\xFF\xD8…\xFF\xD9|密文])。
  • 设置fail2ban。
  • 监控跳板机/var/log/wtmp中的登录IP。
  • 如果没有必要,关闭SSH和其他各类开放端口。
  • 所有明文服务尽可能走tls。如果客户端支持SNI,配置假证书以防止被猜测域名。可以使用lua-resty-sniproxy

欢迎交流

ipip.tk地理位置查询

基于OpenResty ,MaxMind GeoIP数据库和从bgp.he.net生成的ASN数据库,因为没有经纬度的需求所以没有显示。下文有源代码的链接,如果需要可以自行修改加上经纬度或者将输出变为JSON等。

使用方法

查询当前IP地理位置

$ curl https://ipip.tk/
x.x.x.x
Country, City
ASN number

查询当前IP

$ curl https://ipip.tk/ip
x.x.x.x

查询指定IP的地理位置

$ curl https://ipip.tk/74.125.203.199
74.125.203.199
United States, Mountain View
AS15169 Google Inc.

查询域名的地理位置

$ curl https://ipip.tk/www.google.com.hk
74.125.203.199
United States, Mountain View
AS15169 Google Inc.

查询域名的IP

$ curl https://ipip.tk/www.google.com.hk/ip
74.125.203.199

查询域名的IP和CNAME(如果存在)

$ curl https://ipip.tm/www.google.com.hk/dns
www-wide.l.google.com 74.125.203.199

源代码

在这里https://gist.github.com/fffonion/44e5fb59e2a8f0efba5c1965c6043584

需要ngx_http_geoip_module, echo-nginx-module, lua-nginx-module,安装libgeoip,并将maxmind的旧版geoip数据库放在/usr/share/GeoIP

通过bgp.he.net生成ASN数据库

接着看www »

离线下载一条龙

因为怕死 遵纪守法,所以不在自家bt下新番和剧。目前的架构是这样的,造福一下海外党

  1. 一个offshore的DMCA不敏感的服务器。RSS爬取某两个网站添加磁力链接到deluge。nginx添加一个下载目录的location,记得要https,并且给default_server加上假证书,参见这篇博客
  2. 家里一个树莓派或者类似的硬件,运行aria2,开放aria2 rpc端口到公网,加上token。或者ssh转发aria2的端口到一个跳板机。
  3. deluge使用execute插件,在Torrent Complete事件执行shell脚本添加到家里的aria2,并且设置pause值为true。
  4. 树莓派crontab半夜执行aria2.unpauseAll开始下载

用 OpenResty 写了一个 SNI 代理

功能类似于dlundquist/sniproxy

推荐 OpenResty 加上 stream 模块和 ngx_stream_lua_module 模块。在 1.9.15.1 上测试通过。

Github→ https://github.com/fffonion/lua-resty-sniproxy.git

示例配置:

A Lua table sni_rules should be defined in the init_worker_by_lua_block directive.

The key can be either whole host name or regular expression. Use . for a default host name. If no entry is matched, connection will be closed.

The value is a table containing host name and port. If host is set to nil, the server_name in SNI will be used. If the port is not defined or set to nil, 443 will be used.

Rules are applied with the priority as its occurrence sequence in the table. In the example above, twitter.com will match the third rule rather than the fourth.

If the protocol version is less than TLSv1 (eg. SSLv3, SSLv2), connection will be closed, since SNI extension is not supported in these versions.

那么问题就来了

为什么像我这么多愁善感的人,一个月才写一篇博客呢

升级到Ubuntu16.04,开始接受systemd的调教

sudo do-release-upgrade -d

然后进入看戏模式

OpenVZ

openvz(打满补丁的)内核2.6.32-042stab111.X之前不支持220以上版本的systemd,而16.04用的是229,所以升完之后你会得到一个没有systemd存在的美好世界。

只是因为systemd启动不了,所以开机启动项也都不启动了,你得去serial console里手动设ip和route。所以还是发个tk让客服去升级母鸡内核吧www

 

udev

system-udev会自动把网卡名字改成奇怪的em0或者ens0什么的,详情见这里

反正systemd说什么都是对的,所以兄弟请干了这碗热巧克力

可以修改/etc/default/grub 的GRUB_CMDLINE_LINUX,改成:

biosdevname=0

就可以继续使用eth0命名了

 

mysql-apt-config

mysql的官方apt源里还没有支持16.04,而update-manager会尝试将sources.list.d里的源都替换成xenial去更新,所以可能会因为mysql的源没有candidate而报错。

解决办法就是先把/etc/apt/sources.list.d/mysql.list改个扩展名,升完再改回去,然后把里面的trusty改成xenial。这样(mysql支持以后)就可以收到16.04的更新了。

 

update-manager的编码问题

哈哈哈哈哈哈哈哈哈哈哈哈哈哈我先笑一会

add-apt-repository的时候这个问题就存在,如果ppa源的标题带有奇怪的字符会报错。因为Python3是根据当前LC_ALL来自动选择codec的。

然后update-manager也会死在同一个地方,所以记得先export LC_ALL=posix,再sudo do-release-upgrade -d,再喝茶

返回顶部