TLS 代理和 HTTP 服务¶
OpenStack 端点是 HTTP 服务,为公共网络上的最终用户和管理网络上的其他 OpenStack 服务提供 API。 强烈建议所有这些请求,无论是内部请求还是外部请求,都通过 TLS 进行操作。 为了实现此目标,API 服务必须部署在可以建立和终止 TLS 会话的 TLS 代理后面。 下表提供了一个非详尽的开源软件列表,可用于此目的
在软件终止提供的性能不足的情况下,硬件加速器可能是一个值得探索的替代方案。 重要的是要关注任何选定的 TLS 代理将处理的请求的大小。
示例¶
下面我们提供一些推荐的配置设置示例,用于在一些更流行的 Web 服务器/TLS 终止器中启用 TLS。
在深入研究配置之前,我们简要讨论一下密码配置元素及其格式。 关于可用密码和 OpenSSL 密码列表格式的更详尽的介绍可以在这里找到:ciphers。
ciphers = "HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"
或者
ciphers = "kEECDH:kEDH:kRSA:HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"
密码字符串选项用“:”分隔,而“!”提供立即跟随元素的否定。 除非被诸如 HIGH 之类的限定符覆盖,否则元素顺序表示偏好。 让我们更详细地查看上述示例字符串中的元素。
kEECDH:kEDH椭圆曲线 Diffie-Hellman (缩写为 EECDH 和 ECDHE)。
Ephemeral Diffie-Hellman (缩写为 EDH 或 DHE) 使用素数域组。
这两种方法都提供 完美前向保密 (PFS)。 请参阅 完美前向保密,了解有关正确配置 PFS 的更多讨论。
Ephemeral 椭圆曲线要求服务器配置命名曲线,并且比素数域组提供更好的安全性,且计算成本更低。 但是,素数域组的实现更广泛,因此通常将两者都包含在列表中。
kRSA使用 RSA 交换、身份验证或两者之一的密码套件。
HIGH在协商阶段选择尽可能高的安全密码。 这些通常具有 128 位或更长的密钥长度。
!RC4无 RC4。 RC4 在 TLS V3 的上下文中存在缺陷。 请参阅 On the Security of RC4 in TLS and WPA。
!MD5无 MD5。 MD5 不具有碰撞阻力,因此不适用于消息身份验证码 (MAC) 或签名。
!aNULL:!eNULL禁止明文。
!EXP禁止导出加密算法,这些算法的设计倾向于较弱,通常使用 40 和 56 位密钥。
对密码系统的美国出口限制已被取消,不再需要支持。
!LOW:!MEDIUM禁止低 (56 或 64 位长密钥) 和中 (128 位长密钥) 密码,因为它们容易受到暴力攻击 (例如 2-DES)。 此规则仍然允许三重数据加密标准 (Triple DES) 也称为三重数据加密算法 (TDEA) 和高级加密标准 (AES),每个密钥都大于等于 128 位,因此更安全。
协议协议通过 SSL_CTX_set_options 启用/禁用。 我们建议禁用 SSLv2/v3 并启用 TLS。
Pound¶
此 Pound 示例启用了 AES-NI 加速,这有助于提高具有支持此功能的处理器的系统的性能。 默认配置文件在 Ubuntu 上为 /etc/pound/pound.cfg,在 RHEL、CentOS、openSUSE 和 SUSE Linux Enterprise 上为 /etc/pound.cfg。
## see pound(8) for details
daemon 1
######################################################################
## global options:
User "swift"
Group "swift"
#RootJail "/chroot/pound"
## Logging: (goes to syslog by default)
## 0 no logging
## 1 normal
## 2 extended
## 3 Apache-style (common log format)
LogLevel 0
## turn on dynamic scaling (off by default)
# Dyn Scale 1
## check backend every X secs:
Alive 30
## client timeout
#Client 10
## allow 10 second proxy connect time
ConnTO 10
## use hardware-acceleration card supported by openssl(1):
SSLEngine "aesni"
# poundctl control socket
Control "/var/run/pound/poundctl.socket"
######################################################################
## listen, redirect and ... to:
## redirect all swift requests on port 443 to local swift proxy
ListenHTTPS
Address 0.0.0.0
Port 443
Cert "/etc/pound/cert.pem"
## Certs to accept from clients
## CAlist "CA_file"
## Certs to use for client verification
## VerifyList "Verify_file"
## Request client cert - don't verify
## Ciphers "AES256-SHA"
## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
NoHTTPS11 0
## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
xHTTP 1
Service
BackEnd
Address 127.0.0.1
Port 80
End
End
End
Stud¶
可以根据您的需要调整 ciphers 行,但这是一个合理的起点。 默认配置文件位于 /etc/stud 目录中。 但是,默认情况下未提供它。
# SSL x509 certificate file.
pem-file = "
# SSL protocol.
tls = on
ssl = off
# List of allowed SSL ciphers.
# OpenSSL's high-strength ciphers which require authentication
# NOTE: forbids clear text, use of RC4 or MD5 or LOW and MEDIUM strength ciphers
ciphers = "HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM"
# Enforce server cipher list order
prefer-server-ciphers = on
# Number of worker processes
workers = 4
# Listen backlog size
backlog = 1000
# TCP socket keepalive interval in seconds
keepalive = 3600
# Chroot directory
chroot = ""
# Set uid after binding a socket
user = "www-data"
# Set gid after binding a socket
group = "www-data"
# Quiet execution, report only error messages
quiet = off
# Use syslog for logging
syslog = on
# Syslog facility to use
syslog-facility = "daemon"
# Run as daemon
daemon = off
# Report client address using SENDPROXY protocol for haproxy
# Disabling this until we upgrade to HAProxy 1.5
write-proxy = off
Nginx¶
此 Nginx 示例需要 TLS v1.1 或 v1.2 以获得最大安全性。 ssl_ciphers 行可以根据您的需要进行调整,但这是一个合理的起点。 默认配置文件为 /etc/nginx/nginx.conf。
server {
listen : ssl;
ssl_certificate ;
ssl_certificate_key ;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM
ssl_session_tickets off;
server_name _;
keepalive_timeout 5;
location / {
}
}
Apache¶
默认配置文件在 Ubuntu 上为 /etc/apache2/apache2.conf,在 RHEL 和 CentOS 上为 /etc/httpd/conf/httpd.conf,在 openSUSE 和 SUSE Linux Enterprise 上为 /etc/apache2/httpd.conf。
<VirtualHost <ip address>:80>
ServerName <site FQDN>
RedirectPermanent / https://<site FQDN>/
</VirtualHost>
<VirtualHost <ip address>:443>
ServerName <site FQDN>
SSLEngine On
SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM
SSLCertificateFile /path/<site FQDN>.crt
SSLCACertificateFile /path/<site FQDN>.crt
SSLCertificateKeyFile /path/<site FQDN>.key
WSGIScriptAlias / <WSGI script location>
WSGIDaemonProcess horizon user=<user> group=<group> processes=3 threads=10
Alias /static <static files location>
<Directory <WSGI dir>>
# For http server 2.2 and earlier:
Order allow,deny
Allow from all
# Or, in Apache http server 2.4 and later:
# Require all granted
</Directory>
</VirtualHost>
Apache 中的计算 API SSL 端点,您必须将其与一个简短的 WSGI 脚本配对。
<VirtualHost <ip address>:8447>
ServerName <site FQDN>
SSLEngine On
SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM
SSLCertificateFile /path/<site FQDN>.crt
SSLCACertificateFile /path/<site FQDN>.crt
SSLCertificateKeyFile /path/<site FQDN>.key
SSLSessionTickets Off
WSGIScriptAlias / <WSGI script location>
WSGIDaemonProcess osapi user=<user> group=<group> processes=3 threads=10
<Directory <WSGI dir>>
# For http server 2.2 and earlier:
Order allow,deny
Allow from all
# Or, in Apache http server 2.4 and later:
# Require all granted
</Directory>
</VirtualHost>
HTTP 严格传输安全¶
我们建议所有生产部署都使用 HTTP 严格传输安全 (HSTS)。 此标头可防止浏览器在建立单个安全连接后进行不安全的连接。 如果您已将 HTTP 服务部署到公共或不受信任的域,则 HSTS 尤其重要。 要启用 HSTS,请配置 Web 服务器以使用以下标头发送所有请求
Strict-Transport-Security: max-age=31536000; includeSubDomains
在测试期间从 1 天的短超时开始,并在测试表明您没有为用户引入问题后将其提高到一年。 请注意,一旦此标头设置为较大的超时时间,就很难禁用它 (按设计)。
完美前向保密¶
为完美前向保密配置 TLS 服务器需要在密钥大小、会话 ID 和会话票证方面进行仔细规划。 此外,对于多服务器部署,共享状态也是一个重要的考虑因素。 上面 Apache 和 Nginx 的示例配置禁用了会话票证选项,以帮助缓解其中一些问题。 实际部署可能希望启用此功能以提高性能。 可以安全地完成此操作,但需要围绕密钥管理进行特殊考虑。 此类配置超出了本指南的范围。 我们建议阅读 How to botch TLS forward secrecy by ImperialViolet 作为开始了解问题空间的起点。