Total Pageviews

Friday, 8 September 2017

用nginx+ssl证书搭建一个不被审查的站点

先看nginx的配置:
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        listen 443 ssl default_server;

        root /usr/share/nginx/html;

        ssl_certificate certs/default.pem;
        ssl_certificate_key certs/default-nopass.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_prefer_server_ciphers on;
}

server {
    listen 443 ssl spdy;

    ssl_certificate certs/real-cert.pem;
    ssl_certificate_key certs/real-cert-nopass.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
    ssl_prefer_server_ciphers on;

    root /usr/share/nginx/html;

    server_name example.com;

    location / {
                root /path/to/your/files;
                if (-d $request_filename) {
                        return 404;
                }
        try_files $uri $uri/ =404;
        charset utf-8;
    }

              
        location ~ .*/$ {
                root /path/to/your/files;
                access_by_lua '
                        local coo = ngx.var.cookie_coo
                        if coo ~= "coo" then
                                ngx.exit(404)
                        end
                ';
                autoindex on;
                autoindex_exact_size off;
        }
}

   
假设:
审查机关拥有运营商级别的入侵检测设备(比如GFW)

说明:
    全站使用https,关闭SSLv3,关闭弱加密组件
    default_server开启80端口,使用自签名证书;真实需要访问的域名(example.com)必须使用有效的证书,或者在本地信任根证书。注意example.com不能开启80端口,且与default_server使用的证书不能相同。不要使用泛域名证书。这是为了防止审查机关通过直连IP查看返回的证书中的Common Name来得到真实域名。这样配置之后,直连IP https://xxx.xxx.xxx.xxx默认是返回自签名证书,无法得到真实example.com。
    选择性开启autoindex,通过cookie鉴别。注意也可以通过HTTP Basic Authenication认证。对匹配文件夹的uri(”/”结尾)做认证,示例中只有带cookie coo=coo的请求才会返回autoindex,否则返回404。
    在location /中禁用目录末尾自动加斜杠,因为如果自动加斜杠,审查机关可以通过暴力猜测出服务器上有哪些目录确实存在(返回了301到末尾加/的url)。方法是if (-d $request_filename)返回404。
------------

在Apache下部署SSL证书实现HTTPS


HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。谷歌已经制定了一项长远的计划,它的最终目标是将所有通过HTTP协议呈现的网页标为“不安全”,对于站长来说,部署SSL证书来迁移到HTTPS是一个现实和重要的问题,那么,对于Apache webserver来说,如何部署SSL证书实现HTTPS协议呢?下面就讲述一下具体的实现方法。
  安装好Apache, 并且确认是否安装ssl模块,如果没安装的话,使用yum install mod_ssl openssl来安装ssl模块。
  之后,申请并下载SSL证书文件。通常来说有四个文件,分别是:证书文件ca.pem、证书私钥文件ca.key、证书公钥文件public.pem、证书链文件chain.pem。
  ( 1 ) 在Apache的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为ca.key;
  ( 2 ) 打开 apache 安装目录下 conf 目录中的 httpd.conf 文件,找到以下内容并去掉“#”:
  #LoadModule ssl_module modules/mod_ssl.so (如果找不到请确认是否编译过 openssl 插件)
  #Include conf/extra/httpd-ssl.conf
  ( 3 ) 打开 apache 安装目录下 conf/extra/httpd-ssl.conf 文件 (也可能是conf.d/ssl.conf,与操作系统及安装方式有关), 在配置文件中查找以下配置语句:
  # 添加 SSL 协议支持协议,去掉不安全的协议
  SSLProtocol all -SSLv2 -SSLv3
  # 修改加密套件如下
  SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
  SSLHonorCipherOrder on
  # 证书公钥配置
  SSLCertificateFile cert/public.pem
  # 证书私钥配置
  SSLCertificateKeyFile cert/ca.key
  # 证书链配置,如果该属性开头有 '#'字符,请删除掉
  SSLCertificateChainFile cert/chain.pem
  ( 4 ) 设置虚拟主机
  如果要设置http和https同时生效,那么需要为 http 在端口 80 上设立 VirtualHost,同时为 https 在端口 443 上作类似的设置。在端口 80 上的网站的 VirtualHost 例子如下
  <VirtualHost *:80>
  <Directory /var/www/vhosts/yoursite.com/httpdocs>
  AllowOverride All
  </Directory>
  DocumentRoot /var/www/vhosts/yoursite.com/httpdocs
  ServerName yoursite.com
  </VirtualHost>
  在端口 443 上增加一个HTTPS网站,需要在文件加入如下内容
  NameVirtualHost *:443
  然后再加入一个类似如下的 VirtualHost 记录:
  <VirtualHost *:443>
  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/ca.crt
  SSLCertificateKeyFile /etc/pki/tls/private/ca.key
  <Directory /var/www/vhosts/yoursite.com/httpsdocs>
  AllowOverride All
  </Directory>
  DocumentRoot /var/www/vhosts/yoursite.com/httpsdocs
  ServerName yoursite.com
  </VirtualHost>
  最后,使用如下指令重新启动 Apache , 即可实现网站的HTTPS功能。
  /etc/init.d/httpd restart

相关帖子:Apache/Nginx服务器环境强制HTTPS跳转的设置方法
-----------------

Aapache的一些安全设置

证书下来了,给一台服务器重新安装了apache,其中,安全设置记录一下,已方便以后查询.
1,禁用sslv2,由于sslv2有安全隐患,所以最好禁止使用,firefox是直接把sslv2去掉了的.
以下为apache禁用sslv2的方法:
SSLProtocol -ALL +SSLv3 +TLSv1
SSLCipherSuite ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM
测试是否已经关闭的方法:
1#openssl s_client -ssl2 -connect virtualhost:443
2#openssl s_client -ssl3 -connect virtualhost:443
3#openssl s_client -tls1 -connect virtualhost:443
其中第一行应该不能成功建立连接了,就代表sslv2已经被禁用。
具体的说明可以参考这里:http://www.linux4beginners.info/node/disable-sslv2

2,更改Server Header,http里面的Server头表示你访问的服务器的版本信息,一般我们最好隐藏起一些必要的信息,使用以下设置:
ServerTokens Prod
ServerSignature Off
这样设置以后,Server头只会显示 Apache,如果这样你还是不满意,就只能更改源代码了(因为使用mod_headers 也不能修改了)
修改 ./include/ap_release.h
#define AP_SERVER_BASEPRODUCT “Apache”
改成你想要的东东即可,然后重新编译发布。
当然,如果你想改点其他Header,用mod_headers 设置即可,比如
Header add X-Powered-By “ASP.NET”
详细配置文档地址:for 2.2  http://httpd.apache.org/docs/2.2/mod/mod_headers.html
3,Apache官方于2011年8月24日公布漏洞:Range header DoS vulnerability Apache HTTPD 1.3/2.x \(CVE-2011-3192\)
说明:该漏洞可轻易被攻击工具占用大量内存和CPU,导致无法处理正常请求。
影响版本:Apache 1.3 all versions, Apache 2 all versions
临时解决方案:
RequestHeader unset Range
去掉Range请求,呵呵,一般不是下载站点的话,不需要断点续传的了。
漏洞地址:http://people.apache.org/~dirkx/CVE-2011-3192.txt

No comments:

Post a Comment