分类目录归档:Security

在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加速

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,以查看是否成功启用两步验证。