环境概览
系统环境:
代码语言:javascript复制root@tpe-zabbix:/usr/sbin# cat /etc/issue
Ubuntu 20.04.3 LTS n l
Zabbix Server版本:
代码语言:txt复制/usr/sbin/zabbix_server -V
zabbix_server (Zabbix) 5.0.15
Revision 40fb64d970 30 August 2021, compilation time: Jul 28 2021 13:09:54
Copyright (C) 2021 Zabbix SIA
License GPLv2 : GNU GPL version 2 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it according to
the license. There is NO WARRANTY, to the extent permitted by law.
This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/).
Compiled with OpenSSL 1.1.1f 31 Mar 2020
Running with OpenSSL 1.1.1f 31 Mar 2020
Apache2版本:
代码语言:javascript复制/etc/zabbix# apache2 -v
Server version: Apache/2.4.52 (Ubuntu)
Server built: 2021-09-28T11:00:45
Zabbix用户最小权限
这里的用户涉及到Zabbix前端用户、Zabbix 服务器和 Zabbix 代理之间进程用户(默认的zabbix用户),在前端用户的设置根据"权限最小化原则"进行设定。
为 Zabbix 前端设置 HTTPS访问
TLS/SSL 使用公共证书和私钥的组合进行协同工作。SSL 密钥的作用是对服务端发送给客户端的数据进行加密。对于像 Apache、Postfix、Dovecot 等应用通常使用不带密码的密钥。没有密码可以让服务在没有人工干预的情况下自动启动,这通常是我们首选的方式。
步骤 1 – 创建 SSL 证书
- 为证书签名请求 (CSR)生成密钥,在终端提示符运行以下命令:
openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
..........................
.......
e is 65537 (0x10001)
Enter pass phrase for server.key:
会要求输入密钥的保护密码(两次),正确输入后,生成的带密码的服务器密钥并将会存放在server.key文件中。
- 在已加密密钥基础上创建没有密码的密钥:
openssl rsa -in server.key -out server.key.insecure
mv server.key server.key.secure
mv server.key.insecure server.key
不安全(没有密码)的密钥现在命名为server.key,有密码的密钥被命名成了server.key.secure
- 现在我们用不安全(没有密码)的密钥server.key来生成没有密码的签名请求CSR。
要创建没有密码保护的 CSR,请在终端提示符处运行以下命令:
代码语言:javascript复制openssl req -new -key server.key -out server.csr
创建过程将会要求输入密码(上面输入过的密码)。输入正确将会提示要求输入国家、省份、城市、公司、组织、域名(必填项)、电子邮箱地址。这些详细信息将会存储在server.csr文件中。
- 创建自签名证书
要创建自签名证书,请在终端提示符处运行以下命令:
代码语言:javascript复制openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
上述命令将提示输入之前输入过的密码。输入正确的密码后,证书将被创建并存储在server.crt
- 安装证书
您可以通过在终端提示符下运行以下命令来安装密钥文件server.key和证书文件server.crt,或 CA 颁发的证书文件:
代码语言:javascript复制sudo cp server.crt /etc/ssl/certs
sudo cp server.key /etc/ssl/private
步骤 2 – 配置 Apache 以使用 SSL
我们已经在/etc/ss目录下创建了密钥和证书文件。现在我们只需要修改 Apache的配置使其生效。
- 创建SSL/TLS Cipher Suites(密码套件)
- 修改 Apache 虚拟主机文件以指向后面生成的 SSL 证书
- 设定访问HTTP自动跳转HTTPS
步骤3 – 创建SSL/TLS Cipher Suites(密码套件)
首先,我们将为 Apache 设置 SSL/TLS 密码套件,并启用一些有助于服务器安全的高级功能,比如在 Web 服务器上启用 HTTP 严格传输安全 (HSTS),可以保护 Zabbix 前端免受协议降级攻击。设置的参数可供任何启用 SSL 的虚拟主机使用。
在/etc/apache2/conf-available
中创建文件ssl-params.conf
sudo vim /etc/apache2/conf-available/ssl-params.conf
添加以下内容到ssl-params.conf
中:
SSLCipherSuite EECDH AESGCM:EDH AESGCM:AES256 EECDH:AES256 EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off
步骤4 – 修改默认的 Apache SSL 虚拟主机文件
接下来,让我们修改/etc/apache2/sites-available/default-ssl.conf
默认的 Apache SSL 虚拟主机文件。在修改之前,请备份原始 SSL 虚拟主机文件:
sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak
现在,打开 SSL Virtual Host 文件进行调整:
代码语言:javascript复制sudo vim /etc/apache2/sites-available/default-ssl.conf
/etc/apache2/sites-available/default-ssl.conf
代码语言:javascript复制<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch ".(cgi|shtml|phtml|php)$">
SSLOptions StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
根据需要对ServerAdmin 电子邮件地址、ServerName ,证书和密钥文件的路径进行调整。
修改后的配置文件应该类似于这样:
/etc/apache2/sites-available/default-ssl.conf
代码语言:javascript复制<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin your_email@example.com
ServerName server_domain_or_IP
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
<FilesMatch ".(cgi|shtml|phtml|php)$">
SSLOptions StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions StdEnvVars
</Directory>
</VirtualHost>
</IfModule>
完成后保存并关闭文件。
步骤5 – 修改访问 HTTP永久重定向到HTTPS
就目前而言,服务器提供未加密的 HTTP 和加密的 HTTPS 访问。为了更好的安全性,需要设定访问 HTTP自动重定向到 HTTPS。打开/etc/apache2/sites-available/000-default.conf
文件:
sudo vim /etc/apache2/sites-available/000-default.conf
在VirtualHost
配置块中,添加Redirect
指令,:
/etc/apache2/sites-available/000-default.conf
代码语言:javascript复制<VirtualHost *:80>
. . .
Redirect permanent "/" "https://your_domain_or_IP/"
. . .
</VirtualHost>
启用 mod_ssl 和 mod_headers 模块:
代码语言:javascript复制$ sudo a2enmod ssl
$ sudo a2enmod headers
启用读取之前创建的 SSL 配置:
代码语言:javascript复制sudo a2enconf ssl-params
检查配置文件是否存在语法错误:
代码语言:javascript复制sudo apache2ctl configtest
一切就绪后,重新启动 Apache 使其生效:
代码语言:javascript复制sudo systemctl restart apache2
步骤 6 – 测试
打开浏览器,https://
在地址栏中输入服务器的域名或 IP:
https://server_domain_or_IP
禁用 / 删除 Web 服务器信息
作为 Web 服务器强化过程的一部分,建议禁用所有 Web 服务器签名。编辑 /etc/apache2/apache2.conf, 在配置文件未尾添加如下内容:
代码语言:javascript复制ServerSignature Off
ServerTokens Prod
禁用PHP 签名(X-Powered-By HTTP 标头)
默认是禁用的,如果没有禁用可以修改/etc/php/7.4/apache2下的 php.ini 配置文件。
代码语言:javascript复制expose_php = Off
删除 Web 服务器测试页
删除web服务器测试页,避免信息泄露。默认情况下, index.html 的测试页面在/var/www/html路径下
遇到的问题:
- 检查安全模块启用状态 “apachectl -M| grep security”,提示“apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1. Set the ‘ServerName’ directive globally to suppress this message”
解决方法:
代码语言:javascript复制sudo hostnamectl set-hostname ubuntu.mydomain.com
参考:
SSL/TLS Strong Encryption: How-To,Best practices for secure Zabbix setup,Strong Ciphers for Apache, nginx and Lighttpd,