博客里面有一些内容是目前用来自己做一些记录,并不想广为开放。之前博客是放在Github Pages上的,这样是没法自己定制一些认证的。所以这次我将博客部署到了自己的服务器上,使用Nginx来作为Web服务器,这样可以做一些简单的定制。

目前我为了进一步增强网站的安全性,用node.js实现了一个更加安全灵活的的认证系统。

1 Nginx 配置

我使用了HTTP Basic Authentication来保护特定域名下的内容。这里的教程出自官方文档。以下的教程内容在Ubuntu 16.04上验证通过。

1.1 创建密码文件

这里我们使用一些密码文件生成工具来创建用户名-密码文件。

  1. 确保apache2-utils(Debian, Ubuntu)或者httpd-tools(RHEL, CentOS, Oracle Linux)安装了。
  2. 使用下面的命令创建密码文件,并添加第一个用户:
1
$ sudo htpasswd -c /etc/apache2/.htpasswd user1
随后需要以交互的方式输入密码。
  1. 需要添加更多的用户时,省略-c,输入
1
$ sudo htpasswd /etc/apache2/.htpasswd user2
  1. 输出文件/etc/apache2/.htpasswd的文件内容我们可以看到用户名和经过加密的密码
1
2
3
$ cat /etc/apache2/.htpasswd
user1:$apr1$/woC1jnP$KAh0SsVn5qeSMjTtn0E9Q0
user2:$apr1$QdR8fNLT$vbCEEzDj7LyqCMyNpSoBh/

1.2 配置Nginx

以下是我们的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

server {
server_name domian.com;
access_log /path/to/access/log;
error_log /path/to/error/log;

root /blog/files;
index index.html index.htm;

location /protected/path/ {
auth_basic "Private Area";
auth_basic_user_file /etc/apache2/.htpasswd;
}
}

其中auth_basic是访问用户在被要求输入密码时会看到的提示内容:

2 关于HTTP Basic Authentication

这里选择HTTP基本认证是因为这个方法足够简单,而我需要保护的内容的重要性也不是很高,如果有黑客大牛破解了也就破解了。

HTTP基本认证是通过HTTP协议的头部字段来传递认证信息的。认证内容只使用了base64进行编码,而HTTP协议是明文传输的,因此很容易被破解。不过如果网站使用https协议,可以提供一定的机密性。

另一个问题是现代浏览器会缓存认证信息,服务器端没有强制用户下线的方法,这也是一个安全上的漏洞。

更多的信息参考维基,说的比较清楚。