分类目录归档:Security

甲骨文Oracle Cloud免费VPS Ubuntu 18.04/20.04 系统防火墙(UFW和iptables)的正确配置方法

之前写过一篇文章,记录如何配置甲骨文的CentOS 7 系统防火墙(firewalld和iptables)。但是改成Ubuntu系统后,启用UFW防火墙后,发现重启系统后,ufw会变成未激活状态(inavtive),设置的iptables也恢复成了默认状态。下面介绍一下大佬们总结的几种解决办法。

一 甲骨文控制台开放端口

不管哪种办法,先在甲骨文网页控制台开放端口是基本操作。这里复制一下之前的内容。

登陆Oracle Cloud网页后台,进行设置

进入“实例”,点击“实例信息”下的“虚拟云网络”右侧类似“VirtualCloudNetwork-2019****-****”的按钮并进入;

在“(根)区间中的子网”下,如果存在多个类似“公共子网 pbOp:***-**-1 ”的项目列表,就随便点进去一个

在“安全列表”下,点击并进入“Default Security List for VirtualCloudNetwork-2019****-****”。

编辑“入站规则”下“目的地端口范围”为22那条规则,或者参照这条规则新建也可以。
将“目的地端口范围”下的“22”改为“22,80,443”,然后“保存更改”即可。 系统会自动根据添加的IP生成新的两条规则。

注意:每个端口或范围间隔需要英文逗号;如果需要增加UDP端口,就在“IP 协议 ”下选择“UDP”。

二 大佬们的几种方法

2.1 彻底禁用防火墙

简单粗暴,能用就行。不太推荐。

2.1.1 直接删除iptables规则

sudo rm -rf /etc/iptables && reboot

2.1.2 开放所有端口

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
sudo apt-get purge netfilter-persistent
reboot

2.2 使用iptables开放端口

这个大佬使用iptalbes开放了必要的端口,可以用。

sudo iptables -I INPUT -s 0.0.0.0/0 -p tcp --dport 8888 -j ACCEPT 
sudo iptables -I INPUT -s 0.0.0.0/0 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -s 0.0.0.0/0 -p tcp --dport 443 -j ACCEPT 
sudo iptables-save
sudo apt-get update
sudo apt-get install iptables-persistent -y
sudo netfilter-persistent save
sudo netfilter-persistent reload

三 如何正确使用UFW

首先理解UFW只是iptables的配置工具,所以想用UFW就不要把iptables删除或禁用,放着不管就好了。但问题是,就如开头所说,重启会使配置失效。下面来说一下正确使用UFW的流程。

3.1 安装相关软件包

sudo apt-get install iptables-persistent netfilter-persistent ufw

3.2 修改UFW启动配置文件

sudo vi /lib/systemd/system/ufw.service

增加一行“After=netfilter-persistent.service”到[Unit]段最后,改成这个样子:

[Unit]
Description=Uncomplicated firewall
Documentation=man:ufw(8)
DefaultDependencies=no
Before=network.target
After=netfilter-persistent.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/lib/ufw/ufw-init start quiet
ExecStop=/lib/ufw/ufw-init stop

[Install]
WantedBy=multi-user.target

重启系统。

3.3 正常配置UFW防火墙

按常规方式开放22,80,443端口即可。

sudo ufw reset

sudo ufw default deny incoming
sudo ufw default allow outgoing

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

sudo ufw enable

这样应该就可以了。

在Chromebook上使用SSH 密钥登录VPS

方法如下:

生成SSH 密钥对

下载并使用Windosw版的 PuTTYgen生成RSA格式的密钥对。

转换私钥(private key)

导入ppk格式的私钥,在PuTTYgen的菜单栏选择Conversions,选择Export OpenSSH key 或者Export OpenSSH key(force new format)。获得pem格式的私钥,文件名随意。

注:两种格式的pem密钥区别在这里。两种都可以选。想新一点就第二种。

上传公钥(public key)到VPS

教程很多,不细说了。

使用Secure Shell 连接VPS

打开Chromebook上的SSH工具Secure Shell App,填入用户名,ip地址和端口,点击Identity:后面的Import…,选择刚才转换好的PEM格式的私钥,无需导入公钥(public key)。登录就可以了。

如果想删除私钥,方法是:选中要删除的私钥,同时按“搜索键+backspace”。

Oracle Cloud免费VPS CentOS 7 系统防火墙(firewalld和iptables)的正确配置方法

不少人不会配置Oracle的防火墙,导致无法访问80或443端口。本文记录为Oracle Cloud的VPS CentOS 7系统正确配置防火墙的步骤,理论上适用于其他系统,如Debian等。

VPS系统的SELinux为开启状态

sestatus

Firewalld为开启状态

sudo firewall-cmd --state

Iptables为开启状态,查看iptables规则

sudo iptables -L -n

一些人的做法是彻底停用防火墙(firewalld),并清除iptables规则,如:

sudo systemctl stop firewalld

sudo systemctl disable firewalld
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

但是端口仍然可能不能正常访问,同时我们都知道这肯定不是正确的解决方式。那正确的做法是什么呢?

正确的配置方法为:

  1. 登陆VPS的CentOS 7 系统,配置防火墙(firewalld),开放相关服务和端口;
  2. 登陆Oracle Cloud网页后台,进入实例,在“安全列表”中,修改“入站规则”;
  3. 不要手动修改iptables。

例,要建立一个小网站,需要开放80和443端口,步骤为:

第一步,登陆VPS的CentOS 7系统,修改防火墙设置,增加http和https服务,即开启80和443端口

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https

重启防火墙以生效

sudo firewall-cmd --reload

第二步,登陆Oracle Cloud网页后台,进行设置

进入“实例”,点击“实例信息”下的“虚拟云网络”右侧类似“VirtualCloudNetwork-2019****-****”的按钮并进入;

在“(根)区间中的子网”下,如果存在多个类似“公共子网 pbOp:***-**-1 ”的项目列表,就随便点进去一个

在“安全列表”下,点击并进入“Default Security List for VirtualCloudNetwork-2019****-****”。

编辑“入站规则”下“目的地端口范围”为22那条规则,或者参照这条规则新建也可以。
将“目的地端口范围”下的“22”改为“22,80,443”,然后“保存更改”即可。 系统会自动根据添加的IP生成新的两条规则。

注意:每个端口或范围间隔需要英文逗号;如果需要增加UDP端口,就在“IP 协议 ”下选择“UDP”。

至此设置完毕,赶紧访问下你的网页吧。

为Oracle Cloud申请的免费VPS CentOS 7 系统升级内核并开启官方原版BBR加速

20200609 elrepo 5.7.1可以正常启动

经测试elrepo 5.7.1可以正常启动。在正文过程的基础上,更新方法简述:

sudo yum --enablerepo="elrepo-kernel" makecache fast
sudo yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
sudo yum --enablerepo=elrepo-kernel install kernel-ml
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/efi/EFI/centos/grub.cfg
sudo grub2-set-default 0
sudo reboot

20200304 5.5.7内核无法启动

最近发现了问题:尝试从5.3.1内核更新至5.5.7内核时,系统无法启动,VNC提示如下:fb0: bochs-drmdrmfb frame buffer device。建议:1.暂时不要通过elrepo源更新内核;2.以后在升级任何内核时都不要删除旧版本内核。对于甲骨文,只要保留旧版本内核,可以通过VNC连接选择旧版内核启动系统来挽救。

以下为正文

Oracle 云申请的CentOS 7 系统,自带3.1内核,且为EFI引导,并默认开启SELinux,升级内核开启BBR易出现错误导致无法开机。开启原版BBR需要4.9以上内核,以下内容记录升级内核并开启BBR的过程。

更新系统

sudo yum update -y

查看内核

uname -r

3.10.0-1062.1.1.el7.x86_64

改SELinux为permissive模式

查看SELinux状态,默认开启:

sestatus

将enforcing改为permissive,如下:

sudo vi /etc/sysconfig/selinux

SELINUX=permissive

重启vps:

sudo reboot

开启elrepo源

sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

sudo yum install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

查看可安装内核

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

安装内核

sudo yum --enablerepo=elrepo-kernel install kernel-ml

查看新内核是否安装成功

rpm -qa | grep kernel

更新引导

这是一个容易出错的地方,以前碰到的启动配置文件,大多是在/boot/grub2/grub.cfg,而该系统为EFI引导,配置文件位置不同。

sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

列出系统开机的所有启动项

sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/efi/EFI/centos/grub.cfg

设置默认启动项

sudo grub2-set-default 0

重启VPS

sudo reboot

查看内核

uname -r
5.3.1-1.el7.elrepo.x86_64

开启bbr(直接抄袭大佬的全部内容)

执行 lsmod | grep bbr,如果结果中没有 tcp_bbr 的话就先执行:

sudo modprobe tcp_bbr
echo "tcp_bbr" | sudo tee --append /etc/modules-load.d/modules.conf

执行

echo "net.core.default_qdisc=fq" | sudo tee --append /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee --append /etc/sysctl.conf

保存生效

sudo sysctl -p

执行

sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

如果结果都有 bbr,则证明你的内核已开启 BBR。

执行 lsmod | grep bbr,看到有 tcp_bbr 模块即说明 BBR 已启动。

重新开启SELinux

检查有无SELinux相关错误:

sudo cat /var/log/messages | grep "SELinux is preventing"

确保无错误后,再启用SELinux Enforcing 模式

sudo vi /etc/sysconfig/selinux

将permissive改回enforcing,如下修改:

SELINUX=enforcing

重启VPS

sudo reboot

解决Oracle Cloud免费服务申请的VPS无法登陆问题

现象描述

使用puttygen(0.71)生成RSA格式的公钥和私钥,粘贴在“创建计算实例”的“添加SSH密钥”下的“粘贴SSH密钥”中,申请免费的CentOS 7系统的VPS。

当使用命令行登陆VPS时,如:

ssh opc@12.34.56.78 -i .\key.ppk

出现 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

改用putty在SSH-AUTh中选择私钥,登陆VPS,则提示:

No supported authentication methods available(server sent: publickey,gssapi-keyex,gssapi-with-mic)

原因

经多次尝试发现,Oracle的CentOS7 sshd_config 模板中未定义SSH的Protocol,因此登陆时默认使用Protocol 1模式,但命令行和putty默认使用Protocol 2,因此导致无法登陆。

解决方法

使用putty登陆,在putty的设置中,依次点击“Connection”-“SSH”-“Auth”,选中“Attempt TIS or CryptoCard auth (SSH-1)”,登陆即可。

(可选)登陆后可以修改SSH协议为2.

sudo vi /etc/ssh/sshd_config

添加一行

Protocol 2

重启SSH服务即可。

为网站开启QUIC的几点注意事项

QUIC的文章比较多了,但是开启起来仍然是件困扰人的事。本文简要记录一下为网站开启QUIC的几点注意事项。

一 QUIC对比现有HTTP2的主要优势:

  • 显著减少连接建立时间
  • 改进的拥塞控制
  • 无对头阻塞的多路复用
  • 前向纠错
  • 连接迁移

二 开启QUIC的注意事项主要有以下几点:

Caddy的13f9c34已经支持QUIC 44、43、39,运行参数中加入-quic

编译caddy时,需要为主分支的quic-go打一个补丁:
cd $GOPATH/src/github.com/mholt/caddy/vendor/github.com/lucas-clemente/quic-go/

vi quic.patch

quic.pathch的内容如下:

From 20719a7c50c1f97ff0f2272010cda5710794c1d0 Mon Sep 17 00:00:00 2001
From: Marten Seemann <martenseemann@gmail.com>
Date: Thu, 29 Nov 2018 20:33:02 +0700
Subject: [PATCH] use the original tls.Config if tls.Config.GetConfigForClient
 returns nil

---
 internal/crypto/cert_chain.go      | 15 ++++++++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/internal/crypto/cert_chain.go b/internal/crypto/cert_chain.go
index 0c728fd25..45af2952d 100644
--- a/internal/crypto/cert_chain.go
+++ b/internal/crypto/cert_chain.go
@@ -56,8 +56,7 @@ func (c *certChain) GetLeafCert(sni string) ([]byte, error) {
 }
 
 func (c *certChain) getCertForSNI(sni string) (*tls.Certificate, error) {
-	conf := c.config
-	conf, err := maybeGetConfigForClient(conf, sni)
+	conf, err := maybeGetConfigForClient(c.config, sni)
 	if err != nil {
 		return nil, err
 	}
@@ -107,7 +106,13 @@ func maybeGetConfigForClient(c *tls.Config, sni string) (*tls.Config, error) {
 	if c.GetConfigForClient == nil {
 		return c, nil
 	}
-	return c.GetConfigForClient(&tls.ClientHelloInfo{
-		ServerName: sni,
-	})
+	confForClient, err := c.GetConfigForClient(&tls.ClientHelloInfo{ServerName: sni})
+	if err != nil {
+		return nil, err
+	}
+	// if GetConfigForClient returns nil, use the original config
+	if confForClient == nil {
+		return c, nil
+	}
+	return confForClient, nil
 }

patch -p1 < quic.patch

之后再进入caddy目录进行下一步的编译:

cd $GOPATH/src/github.com/mholt/caddy

请升级到目前的最新版 1.11。

  • 在防火墙中为443端口开启udp

          Firewalld:

sudo firewall-cmd --zone=public --add-port=443/udp --permanent

          iptables:

sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT
  • 将Chrome升级到最新版

在chrome://flags/#enable-quic中启用QUIC支持。

三 一个查看QUIC支持情况的命令

curl -I https://www.coldawn.com we get
HTTP/1.1 200 OK
Alt-Svc: quic=":443"; ma=2592000; v="44,43,39"
Cache-Control: max-age=8640000
Content-Type: text/html; charset=UTF-8
Link: <https://www.coldawn.com/wp-json/>; rel="https://api.w.org/"
Server: Caddy
Strict-Transport-Security: max-age=31536000;
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-Powered-By: PHP/7.2.10
X-Xss-Protection: 1; mode=block
Date: Fri, 28 Sep 2018 04:29:41 GMT

为IOS 1password 启用PIN 码

从安全的角度来说,指纹识别和faceID比密码(PIN)要好,但是对于没有faceID的IOS设备,有不少时候指纹识别不灵敏或者无法识别。这时需要输入较长的1password主密码,这是令人头痛的事。好在IOS版1password提供了PIN码功能,即输入四位数字密码,即可解锁1password。

但是这个功能隐藏的比较深。具体开启方法如下:

登录1password,“设置”-“高级”-“安全”-“PIN码”。

注意:开启PIN码后,将不能使用指纹识别和faceID来登陆1password。

CentOS 7 编译安装nginx并启用TLS1.3

暂时转向caddy,caddy已经可以支持tls v1.3

更新日志

20180708
OpenSSL于2018年6月8日更新了关于tls 1.3的说明,见此wiki,本文按新wiki修改更新;
主要变化有:OpenSSL目前同时支持“draft-26”, "draft-27" and "draft-28"草案;简化流程,编译时默认开启tls 1.3,无需enable参数;加密算法表达的更新;
Chrome canary 69.0.3484.0 和 Firefox Nightly 63.0a1支持tls1.3 Draft 28。
20180411
Firefox Nightly 61.0a1支持tls1.3 Draft 26。
20180404
IESG批准将TLS 1.3 Draft 28作为TLS version 1.3 的建议标准;
至20180404,Openssl支持的标准为Draft 26。
20180312
Chrome 65正式版已经发布,支持tls1.3 Draft 23。
20180207
修正部分错误。
如果TLSv1.3如期发布,OpenSSL 1.1.1 将于2018年4月17日面向公众发布。对于服务器来说,我还是喜欢CentOS,支持周期很长,折腾一次可以用很长世间,因此以下记录一下在基于LNMP的CentOS 7 系统上启用TLSv1.3的过程。

1 升级系统

yum update

升级后的系统版本为:

cat /etc/centos-release CentOS Linux release 7.5.1804 (Core)

2 安装官方mainline版的nginx

通过官方源安装nginx的目的是:
自动生成nginx的配置文件,减少大量的工作;
获取nginx的编译参数。

配置源:

vi /etc/yum.repos.d/nginx.repo

写入如下内容:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=1

安装nginx:

yum install nginx -y

查看nginx版本:

nginx -v nginx version: nginx/1.15.1

获取编译参数:

nginx -V nginx version: nginx/1.15.1 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'

修改nginx源,将enabled=1改为enabled=0,防止yum update时nginx被更新掉

vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/ gpgcheck=0 enabled=0

3 编译nginx

安装可能用到的依赖:

yum install -y git gcc gcc-c clang automake make autoconf libtool zlib-devel libatomic_ops-devel pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel gperftools-devel  perl-devel perl-ExtUtils-Embed

获取源码:

git clone https://github.com/nginx/nginx.git
git clone https://github.com/openssl/openssl.git
git clone https://github.com/grahamedgecombe/nginx-ct.git

nginx-ct是启用证书透明度(Certificate Transparency)策略的模块。为了启用Certificate Transparency和TLSv1.3,需要额外加入如下编译参数:

--add-module=../nginx-ct/ --with-openssl=../openssl/

加在官方编译参数后面,简单修改形成完整的编译参数:

auto/configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=../nginx-ct/ --with-openssl=../openssl/

进入nginx源码目录,并输入如上完整的编译参数。
开始编译:

make

查看编译好的nginx信息:

./objs/nginx -v nginx version: nginx/1.15.2

备份已经安装好的官方mainline版,安装编译版:

mv /usr/sbin/nginx /usr/sbin/nginx.1.15.1.20180708.official.mainline
cp ./objs/nginx /usr/sbin/

4 修改nginx配置文件内的ssl_protocols和ssl_ciphers,默认启用TLSv1.3的前三项常用的加密算法

...
ssl_protocols          TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers            EECDH+CHACHA20:ECDHE+aECDSA+CHACHA20:ECDHE+aRSA+CHACHA20:ECDHE+aECDSA+AESGCM:ECDHE+aRSA+AESGCM:ECDHE+aECDSA+AES256+SHA384:ECDHE+aRSA+AES256+SHA384:ECDHE+aECDSA+AES256+SHA:ECDHE+aRSA+AES256+SHA;
...

重启nginx服务以使修改生效:

systemctl restart nginx

5 测试TLSv1.3是否生效

5.1 使用testssl工具
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
cd testssl.sh
./testssl.sh --help

命令为(coldawn.com需要换成自己的域名):

./testssl.sh -p coldawn.com ... Testing protocols via sockets except SPDY+HTTP2 SSLv2 not offered (OK) SSLv3 not offered (OK) TLS 1 offered TLS 1.1 offered TLS 1.2 offered (OK) TLS 1.3 offered (OK): draft 28, draft 27, draft 26 NPN/SPDY h2, http/1.1 (advertised) ALPN/HTTP2 h2, http/1.1 (offered) ...

详细的情况,用大写的P作为参数:

./testssl.sh -P coldawn.com

 Testing server preferences

 Has server cipher order?     yes (OK)
 Negotiated protocol          TLSv1.3
 Negotiated cipher            TLS_AES_256_GCM_SHA384, 253 bit ECDH (X25519)
 Cipher order
    TLSv1:     ECDHE-RSA-AES256-SHA
    TLSv1.1:   ECDHE-RSA-AES256-SHA
    TLSv1.2:   ECDHE-RSA-CHACHA20-POLY1305 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-SHA384 ECDHE-RSA-AES256-SHA
    TLSv1.3:   TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 TLS_AES_128_GCM_SHA256
5.2 使用现代浏览器

Chrome canary 69.0.3484.0 和 Firefox Nightly 63.0a1已经支持tls1.3 Draft 28。

在 Mac 或 PC 上更改Apple ID 国家或地区为美国的方法

将iCloud数据放到中国有国家安全和苹果方面的考虑,云上贵州也会为当地带来经济增长。大家都注意到了隐私声明:《iCloud(由云上贵州运营)条款与条件》中有意思的地方之一:

您理解并同意,苹果公司和云上贵州有权访问您在此服务中存储的所有数据,包括根据适用法律向对方和在彼此之间共享、交换和披露所有用户数据(包括内容)的权利。

虽然明知早已没有隐私,但是仍有人以为更改国家和地区就可以避免将iCloud数据存放在云上贵州从而避免所有数据被有权访问。有些人尝试了但没有成功,卡在付款方式那里,没有“无”这个选项。

付款信息为何没有“无”

苹果官方给出了“如果您无法在编辑 Apple ID 付款信息时选取“无””的解释和解决方案,简要的记录如下:
1 如果您有未付余款或应付账款
您必须先付清余款,然后才能选择“无”作为付款方式。
2 如果您有自动续订的订阅
除非您取消订阅,否则可能无法选择“无”。
3 如果您是首次使用 iTunes Store 或 App Store
如果您是首次通过现有的 Apple ID 来使用商店,则必须提供付款方式。创建帐户后,您可以将付款信息更改为“无”。
4 如果您不在创建的 Apple ID 所属的国家或地区
如果您是首次创建 Apple ID,而且创建时身处这个 Apple ID 所属的国家或地区之外的地方,那么您必须输入付款方式。这种情况下,您无法选择礼品卡或商店余额作为付款方式。
例如,如果您身处美国,但所创建的 Apple ID 的账单邮寄地址却在中国,那么您将无法选取“无”作为付款方式。
5 如果您更改了帐号所属国家或地区
当您更改现有 Apple ID 所属的国家或地区时,必须提供付款方式并更新您的账单选项。这种情况下,您无法选择礼品卡或商店余额作为付款方式。更改国家或地区后,如果您要移除付款方式,可将付款信息更改为“无”。
6 如果您是“家人共享”的一员
当您设置“家人共享”时,家庭组织者必须提供有效的付款方式。这个付款方式将用于家庭成员发起的所有购买,且只有家庭组织者可以更改。
如果您要停止使用“家人共享”,可以解散您的家庭群组。

可行的做法

参照上面的条目逐一排查,该付清的付清,该取消的取消,该解散的解散,然后全程使用美国IP,按照官方提供的方法:在 Mac 或 PC 上更改您的国家或地区,使用iTunes进行操作。
1 打开iTunes,登陆Apple ID。
2 从您电脑屏幕顶部或 iTunes 窗口顶部的菜单栏中,选取“帐户”>“查看我的帐户”。
3 在“帐户信息”页面上,点按“国家或地区”右边的“更改国家或地区”。
4 从“选择国家或地区”菜单中,选择新的国家或地区,比如:美国。
5 下拉阅读条款与条件以及 Apple 隐私政策,两次点按“同意”。
6 在付款信息页面,付款方式选择无,付款地址找一个免税州,比如俄勒冈州(Oregon)的某地址,点按“继续”完成更改。

注:上文主要的讲的是更改国家和地区的方法;
如果是想创建美国Apple ID的话,那么还是全程美国IP,在iTunes中下载一个免费应用,按照提示操作就可以了。

为Debian 9 stretch的SSH登录安装并启用谷歌两步验证(google authenticator)

以密钥方式登录vps提供了更高的安全性,但以用户名密码登录vps的方式比用密钥方式更适用于经常多个地方登录的情况,此时需要加用两步验证防止用户名密码泄漏的情况。目前网上搜索到的教程多半已经过时,稍有不慎,容易配置失误导致自己无法登录vps。本文就如何在Debian 9上正确的设置谷歌两步验证做个介绍。

开始之前需要先有个Debian 9;
下文出现的命令都是一行一条,虽然有时可以全部复制一起执行,但不建议这么做,还是老老实实一行一行执行吧。无特殊说明均以root用户执行。

1 更新系统

apt-get update
apt-get upgrade -y
apt-get dist-upgrade -y

2 安装所需的软件包

apt-get install wget make gcc libpam0g-dev git autotools-dev autoconf libtool qrencode -y

3 下载并安装两步验证源码

假设打算将源码放到/usr/local/src目录下:

cd /usr/local/src
git clone https://github.com/google/google-authenticator-libpam.git
cd google-authenticator-libpam/
./bootstrap.sh
./configure
make
make install

在安装信息中可以看到有这样一行:
libtool: install: /usr/bin/install -c .libs/pam_google_authenticator.so /usr/local/lib/security/pam_google_authenticator.so
这个信息提供了开启两步验证所需的最重要的文件的安装路径,很多教程无法成功启用两步验证就在于此。

4 修改ssh相关配置文件

4.1 修改sshd_config

将ChallengeResponseAuthentication的no改为yes:

vi /etc/ssh/sshd_config

...
ChallengeResponseAuthentication yes
...
4.2 修改sshd

在/etc/pam.d/sshd第一行后加入auth required /usr/local/lib/security/pam_google_authenticator.so。

vi /etc/pam.d/sshd

# PAM configuration for the Secure Shell service
auth       required     /usr/local/lib/security/pam_google_authenticator.so

# Standard Un*x authentication.
...

5 开启两步验证

当以root用户安装完两步验证后,需要针对某个用户启用两步验证,需要切换为该用户时才能正确启用。假设为名为jackson的用户开启两步验证,需要切换为该用户:

su jackson

然后运行如下命令配置两步验证:

google-authenticator

依次输入5个“y”并回车确认安装即可。
注意备份好密钥(secret key)和备用验证码(emergency scratch codes)。
重启sshd来使两步验证即时生效:

sudo service sshd restart

注意此时不要关闭ssh登录窗口。因为如果启用失败,而又关闭了这个已登录的窗口会把自己挡在外面的。

6 验证是否开启成功

用app扫描二维码或者手动输入密钥启用两步验证,然后打开一个新的ssh窗口尝试登录vps,以查看是否成功启用两步验证。