编程技术分享平台

网站首页 > 技术教程 正文

apache安全基线(linux安全基线配置)

xnh888 2024-10-06 05:01:06 技术教程 26 ℃ 0 评论

1.apache介绍

摘抄自百度百科:Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。自1996年诞生以来,Apache由于其跨平台性、安全性和开源特性,一直占据着Web服务器领域的领先地位。以下是Apache的主要特点:

开源性。Apache的源代码公开,允许开发者查看和修改源代码,这使得Apache能够不断发展和完善。

跨平台性。Apache可以在几乎所有的计算机平台上运行,包括Windows、Linux、UNIX等操作系统。

模块化设计。Apache支持各种模块,可以处理Web访问中的各种问题,如高频访问、并发限制、日志监控、负载均衡、图像处理等。

稳定性与安全性。Apache以其稳定性和良好的安全性而被广泛使用。

apache官网:www.apache.org

学习手册:http://httpd.apache.org/docs/2.4/

yum/apt安装配置文件在:/etc/apache2/apache2.conf

编译安装配置文件在:/usr/local/apache/conf/httpd.conf

容器启动配置文件在:/usr/local/apache2/conf/httpd.conf

我基本都是使用nginx,对apache不是很熟悉。但是这些配置项都是经过实际测试效果的。本文环境以ubuntu22.04,apt安装apache最新版2.4.52为例。

2.安装apache

apache的安全基线配置与nginx大同小异,可以去看我以前写的nginx安全基线一文,无非是敏感信息隐藏、安全头配置、日志保存审计等。

  • yum/apt安装:
 #添加apache官方源
 sudo apt install software-properties-common
 sudo add-apt-repository $PPA:ondrej/apache2
 sudo apt update
 #安装apache2
 apt-get install apache2
  • 源码编译安装:
 #安装依赖包
 sudo apt-get update
 sudo apt-get install -y build-essential libssl-dev libpcre3-dev libxml2-dev zlib1g-dev
 #安装编译环境
 wget http://mirrors.tuna.tsinghua.edu.cn/apache/apr/apr-1.6.5.tar.gz
 tar -zxf apr-1.6.5.tar.gz && cd  apr-1.6.5 &&  ./configure --prefix=/usr/local/apr &&  make && make install
 
 cd .. && wget http://archive.apache.org/dist/apr/apr-util-1.3.12.tar.gz && tar -zxf apr-util-1.3.12.tar.gz && cd apr-util-1.3.12 && ./configure --prefix=/usr/local/apr-util -with-apr=/usr/local/apr/bin/apr-1-config && make && make install
 
 cd .. && wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.10/pcre-8.10.zip && unzip -o pcre-8.10.zip && cd pcre-8.10 && ./configure --disable-shared --with-pic --prefix=/usr/local/pcre && make && make install
 #下载apache源码
 wget https://downloads.apache.org/httpd/httpd-2.4.59.tar.gz
 #解压并进入源码目录
 tar -zxvf httpd-2.4.59.tar.gz && cd httpd-2.4.59
 #配置apache编译环境
 ./configure --with-apr=/usr/local/apr \
 --with-apr-util=/usr/local/apr-util \
 --with-pcre=/usr/local/pcre \
 --prefix=/usr/local/apache --enable-so --with-ssl
 #编译安装
 make && make install
 #配置apache为系统服务
 cat >> /etc/systemd/system/httpd.service <<EOF
 [Unit]
 Description=The Apache HTTP Server
 After=network.target remote-fs.target nss-lookup.target
 
 [Service]
 Type=forking
 PIDFile=/usr/local/apache/logs/httpd.pid
 ExecStart=/usr/local/apache/bin/apachectl start
 ExecStop=/usr/local/apache/bin/apachectl stop
 PrivateTmp=true
 
 [Install]
 WantedBy=multi-user.target
 EOF
 #apache开机自启
 sudo systemctl daemon-reload
 sudo systemctl start httpd
 sudo systemctl enable httpd
  • docker运行:
 docker run -itd -p 80:80 httpd

3.apache软件版本相关

3.1使用最新版本

 #添加apache官方源
 sudo apt install software-properties-common
 sudo add-apt-repository $PPA:ondrej/apache2
 sudo apt update
 #安装apache2
 apt-get install apache2
 #查看apache版本
 root@K8S:~# apache2 -v
 Server version: Apache/2.4.52 (Ubuntu)
 Server built:   2024-04-10T17:45:18

3.2禁止显示apache版本信息

隐藏Apache的版本信息可以减少攻击者获取服务器版本的机会,从而降低被已知漏洞攻击的风险。

 vim /etc/apache2/conf-available/security.conf
     #错误页面不显示版本信息
     ServerSignature Off
     #只显示软件名称
     ServerTokens Prod
 systemctl restart apache2

4安全传输相关

4.1配置HTTPS

配置https证书可以加密在互联中传输的数据,保证数据安全,但是要搭配ssl证书使用。注意:此时没有配置https重定向,相当于没有强制加密传输,http仍然可用。

 vim /etc/apache2/sites-available/000-default.conf
 
     <VirtualHost *:443>
         SSLEngine on
         SSLCertificateFile /etc/apache2/cert/fanyum/cert.pem
         SSLCertificateKeyFile /etc/apache2/cert/fanyum/key.pem
         # Other SSL settings
     </VirtualHost>
 #启用ssl模块
 a2enmod ssl
 systemctl restart apache2

4.2启用HTTP严格传输

确保浏览器只通过HTTPS与服务器通信,以防止中间人攻击,必须搭配ssl证书使用。因为测试环境没有加载其他资源,所以只能体现重定向功能了。注意:如果网站上有任何非HTTPS资源,可能会导致内容加载问题。

 vim /etc/apache2/sites-available/000-default.conf
 #http虚拟主机下添加重定向配置
 RedirectPermanent / https://你的域名/
 
 vim /etc/apache2/sites-available/default-ssl.conf
 #强制浏览器使用HSTS
     #启用headers模块
     LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
     #强制使用HSTS
     Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

4.3限制访问控制

使用`<Directory>指令限制对特定目录的访问,但是需要为特定用户或IP设置例外,不然都访问不了。

 vim /etc/apache2/apache2.conf
 
 #限制对pic目录的访问
 <Directory /var/www/html/pic>
     Order deny,allow
     Deny from all
 </Directory>
 systemctl restart apache2

4.4禁用目录浏览

默认情况下,如果目录中没有索引文件,Apache会显示目录列表。禁用目录浏览可以防止暴露不必要的信息,用户只能访问明确的资源。

 vim /etc/apache2/apache2.conf
 <Directory "/var/www/html/pic">
     Options -Indexes
 </Directory>
 systemctl restart apache2

4.5 防止内容类型嗅探

通过设置X-Content-Type-Options头,防止浏览器对响应内容进行MIME类型嗅探,可以防止潜在的MIME类型混淆攻击。

 vim /etc/apache2/apache2.conf 或sites-available/的特定站点配置文件
     #启用headers模块,可以写到主配置文件中
     LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
     #启用防内容嗅探
    <IfModule mod_headers.c>
         Header always set X-Content-Type-Options "nosniff"
     </IfModule>
 systemctl restart apache2

4.6 防止点击劫持

通过设置X-Frame-Options头,防止自己的网站被其他网站以iframe的形式嵌入,以防止点击劫持攻击。

 vim /etc/apache2/apache2.conf 或sites-available/的特定站点配置文件
     #启用headers模块,可以写到主配置文件中
     LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
     #启用防点击劫持
     <IfModule mod_headers.c>
         Header always set X-Frame-Options "DENY"
     </IfModule>
 systemctl restart apache2

4.7 跨站脚本(XSS)保护

设置X-XSS-Protection头,启用浏览器的XSS过滤功能。但是有可能会导致一些合法的脚本也无法运行。

 vim /etc/apache2/apache2.conf 或sites-available/的特定站点配置文件
     #启用headers模块,可以写到主配置文件中
     LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
     #启用xss保护
     <IfModule mod_headers.c>
         Header set X-XSS-Protection "1; mode=block"
     </IfModule>
 systemctl restart apache2

4.8跨站点请求伪造(CSRF)保护

设置X-CSRF-Token头,防止CSRF攻击。但是需要在应用程序中实现CSRF令牌的生成和验证,一定程度上增加开发工作量。

4.9限制上传目录的权限

确保上传目录的权限设置合理,避免用户直接执行上传的文件

4.10 启用ModSecurity

ModSecurity是一个Web应用防火墙,可以防止各种攻击。考虑安装和配置ModSecurity模块,提供额外的安全防护层。但是因为比较麻烦,我没有使用过。我个人一般是直接使用safeline对流量进行清洗和转发(后面会写一篇,十分简单且有效)。

5日志审计

5.1配置日志记录

编辑/etc/apache2/apache2.conf配置文件,设置日志记录文件、记录内容、记录格式。

access_log配置可以详细记录网站的访问记录,每当有客户端请求到达apache服务器时,无论是成功的请求还是失败的请求,nginx都会记录相关信息到这个日志文件中。这些信息包括但不限于请求时间、客户端IP、请求方法(GET、POST等)、请求的URL、HTTP响应状态码等。

error_log配置可以记录nginx的错误日志文件。错误日志用于记录服务器运行时发生的错误、警告和其他重要事件。设置为warn意味着日志将记录从警告级别(warn)及以上级别的消息,包括错误(error)、关键(crit)、警报(alert)和紧急(emerg)级别。debug、info和notice级别的日志不会被记录。

 vim /etc/apache2/apache2.conf
 #记录的日志等级
 LogLevel warn
 #combined格式记录正常访问日志
 CustomLog /var/log/apache2/access.log combined
 #错误日志记录
 ErrorLog /var/log/apache2/error.log

5.2配置日志轮转

设置日志保存时间为6个月,以满足日志审计的要求。在Linux中最常用的工具是logrotate,logrotate的默认配置文件在/etc/logrotate.d/下。如果是编译安装的话则不存在/etc/logrotate.d/apache2文件,直接手动新增即可。

如果每天轮转一次觉得太频繁可以使用 weekly rotate 26每周轮转一次,记录26次也是180天

 #备份默认的logrotate
 mv /etc/logrotate.d/apache2 /etc/logrotate.d/apache2.bak
 #修改apache2的备份配置,按天轮转180天。不要把注释复制进去,可能会产生奇怪的问题(我导致了无法重新读取apache2配置,无法重新生成access.log文件,找了好久的问题才解决)。
 cat >> /etc/logrotate.d/apache2 <<EOF
 /var/log/apache2/access.log {
      daily                  #按天轮转
      missingok              #如果日志文件丢失,不产生错误
      rotate 180             #保留180天的日志文件
      compress               #使用gzip压缩轮转后的日志文件
      delaycompress          #压缩操作延迟到下一次轮转时执行
      notifempty             #如果日志文件为空,则不进行轮转
      create 640 root adm    #创建新的文件日志并设置属主属组
      sharedscripts          #共享脚本,仅在所有日志都处理完后执行一次
      postrotate
         /usr/sbin/apache2ctl graceful > /dev/null 2>&1 || true
      endscript              #重新加载Apache配置,避免日志被锁定
  }
 
 /var/log/apache2/error.log {
      daily                  #按天轮转
      missingok              #如果日志文件丢失,不产生错误
      rotate 180             #保留180天的日志文件
      compress               #使用gzip压缩轮转后的日志文件
      delaycompress          #压缩操作延迟到下一次轮转时执行
      notifempty             #如果日志文件为空,则不进行轮转
      create 640 root adm    #创建新的文件日志并设置属主属组
      sharedscripts          #共享脚本,仅在所有日志都处理完后执行一次
      postrotate
         /usr/sbin/apache2ctl graceful > /dev/null 2>&1 || true
      endscript              #重新加载Apache配置,避免日志被锁定
  }
 EOF

5.2.1轮转测试

  #测试配置是否正确。-v代表即详细模式,-f强制立即执行轮转。
 logrotate -vf /etc/logrotate.d/apache2
  #可以发现成功轮转和压缩,先轮转再压缩
 ll /var/log/apache2/
 root@K8S:/var/log/apache2# ls
 access.log    access.log.2.gz  error.log.1     other_vhosts_access.log
 access.log.1  error.log        error.log.2.gz





本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表