Zabbix服务器安全基础加固

2022-01-10 10:18:25 浏览数 (1)

环境概览

系统环境:

代码语言: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 Admin”用户类型的权限低于“Zabbix Super Admin”用户类型,但它具有允许管理配置和执行自定义脚本的管理权限。“Zabbix Admin”用户类型的权限低于“Zabbix Super Admin”用户类型,但它具有允许管理配置和执行自定义脚本的管理权限。
严格设定用户组的权限,再分配给相应的用户严格设定用户组的权限,再分配给相应的用户

为 Zabbix 前端设置 HTTPS访问

TLS/SSL 使用公共证书和私钥的组合进行协同工作。SSL 密钥的作用是对服务端发送给客户端的数据进行加密。对于像 Apache、Postfix、Dovecot 等应用通常使用不带密码的密钥。没有密码可以让服务在没有人工干预的情况下自动启动,这通常是我们首选的方式。

步骤 1 – 创建 SSL 证书

  • 为证书签名请求 (CSR)生成密钥,在终端提示符运行以下命令:
代码语言:javascript复制
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文件中。

  • 在已加密密钥基础上创建没有密码的密钥:
代码语言:javascript复制
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的配置使其生效。

  1. 创建SSL/TLS Cipher Suites(密码套件)
  2. 修改 Apache 虚拟主机文件以指向后面生成的 SSL 证书
  3. 设定访问HTTP自动跳转HTTPS

步骤3 – 创建SSL/TLS Cipher Suites(密码套件)

首先,我们将为 Apache 设置 SSL/TLS 密码套件,并启用一些有助于服务器安全的高级功能,比如在 Web 服务器上启用 HTTP 严格传输安全 (HSTS),可以保护 Zabbix 前端免受协议降级攻击。设置的参数可供任何启用 SSL 的虚拟主机使用。

/etc/apache2/conf-available中创建文件ssl-params.conf

代码语言:javascript复制
sudo vim /etc/apache2/conf-available/ssl-params.conf

添加以下内容到ssl-params.conf中:

代码语言:javascript复制
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 虚拟主机文件:

代码语言:javascript复制
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文件:

代码语言:javascript复制
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:

代码语言:javascript复制
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路径下

遇到的问题:

  1. 检查安全模块启用状态 “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-ToBest practices for secure Zabbix setup,Strong Ciphers for Apache, nginx and Lighttpd,

0 人点赞