先看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。
------------
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
#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
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>
<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>
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跳转的设置方法
-----------------
相关帖子: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
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已经被禁用。
2,更改Server Header,http里面的Server头表示你访问的服务器的版本信息,一般我们最好隐藏起一些必要的信息,使用以下设置:
ServerTokens Prod
ServerSignature Off
ServerSignature Off
这样设置以后,Server头只会显示 Apache,如果这样你还是不满意,就只能更改源代码了(因为使用mod_headers 也不能修改了)
修改 ./include/ap_release.h
修改 ./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
说明:该漏洞可轻易被攻击工具占用大量内存和CPU,导致无法处理正常请求。
影响版本:Apache 1.3 all versions, Apache 2 all versions
临时解决方案:
RequestHeader unset Range
去掉Range请求,呵呵,一般不是下载站点的话,不需要断点续传的了。
漏洞地址:http://people.apache.org/~dirkx/CVE-2011-3192.txt
漏洞地址:http://people.apache.org/~dirkx/CVE-2011-3192.txt
No comments:
Post a Comment