Lighttpd 高级安全

来自 Alpine Linux

访问控制列表

这是一种定义目录的方法,只允许来自指定 IP 的客户端访问。这对于允许内部 LAN 客户端访问状态页面或员工联系信息,并拒绝其他客户端可能很有用。

 #### access control list for hidden_dir (not for use behind proxies) CAUTION REMOVE "#" to work
$HTTP["remoteip"] !~ "127.0.0.1|10.10.10.2|20.10.20.30" {
   $HTTP["url"] =~ "^/hidden_dir/" {
     url.access-deny = ( "" )
   }
}
  • remoteip 将仅与单个 IP 进行比较,在该示例中再次与 3 个 IP 进行比较。 !~ 仅用于允许的 IP,其余将被拒绝(负比较)。
  • hidden_dir 是您的根 htdocs 网站服务器位置下的相对路径名称,或提供文件的绝对路径。
$HTTP["url"] =~ "^/hidden_dir/" {
    $HTTP["remoteip"] == "33.222.0.0/16" {
    }
    else $HTTP["remoteip"] == "75.209.116.4" {
    }
    else $HTTP["remoteip"] == "79.31.34.79" {
    }
    else $HTTP["remoteip"] != "" {  # (dummy match everything)
        url.access-deny = ( "" )
    }
}
  • 33.222.0.0/16 在这种情况下,我们首先匹配被拒绝的条目,然后检查访问该条目的 IP,并且对于每个网络范围,最后将是访问拒绝规则。
参见

阻止图片盗链

图片盗链是指某人链接到您网站上的图片或视频之一,但将其显示在其网站上作为自己的内容。 这样做是为了将浏览器发送到您的服务器以使用您的带宽,并使内容看起来像是盗链者网站的一部分。 这在人们链接到图片并将其添加到公共论坛或博客列表时最为常见。 他们可以在其内容中使用您的图片,而不必使用他们的带宽或服务器来托管该文件。 为了保持较低的带宽使用率,您应该阻止来自那些未从您的站点请求连接的客户端对图像的访问。 请注意,此功能可用于任何类型的内容。 只需将文件类型添加到 url.access-deny 列表即可。 如果您想获得更多关于降低带宽使用率的想法,请查看我们的节省 Web 服务器带宽(技巧)。

 #### stop image hijacking (anti-hotlinking) CAUTION REMOVE "#" to work
 # $HTTP["referer"] !~ "^(http://midominio\.org|http://www\.midominio\.org)" {
 #     url.access-deny = ( ".jpg", ".jpeg", ".png", ".avi", ".mov" )
 # }

虚拟主机限制

虚拟主机是您的 Web 服务器的主机名。 例如,本网站名为 calomel.org。 一些机器人和扫描器将尝试使用 IP 地址或根本没有主机名标头来访问您的站点,以绕过虚拟主机限制。 我们可以通过要求所有想要访问我们服务器的客户端都通过我们的官方主机名引用我们来阻止这种类型的行为。 这将阻止任何正在扫描 IP 地址或试图恶作剧的人,但允许像浏览器和 Google 这样的正常客户端和机器人。

 #### virtual host limits CAUTION REMOVE "#" to work
 # $HTTP["host"] !~ "^(midominio\.org|www\.midominio\.org)" {
 #     url.access-deny = ( "" )
 #  }

阻止来源页垃圾信息

来源页垃圾信息更多的是一种烦恼,而不是问题。 网站将使用引用其网站的来源页字段连接到您的服务器。 想法是,如果您发布您的 Web 日志或统计信息,那么他们的主机名将显示在您的页面上。 当像 Google 这样的搜索引擎机器人访问时,它会看到从您的站点到他们的站点的链接,并给予他们更多的 PageRank 信用。 首先,永远不要公开您的 Web 日志。 其次,使用以下行阻止访问来源页垃圾信息发送者。

 #### stop referer spam CAUTION REMOVE "#" to work
 # $HTTP["referer"] =~ "(tarotathome|casinospam)" {
 #     url.access-deny = ( "" )
 #  }

现代 HTTPS 访问

为了更高的安全性,lighttpd 1.4.56 及更高版本可以配置为允许使用现代 TLS 版本和密码套件进行 HTTPS 访问。

需要修改 lighttpd 的配置。

nano /etc/lighttpd/lighttpd.conf

调整下面的路径,使 'ssl.pemfile' 和 'ssl.privkey' 指向证书和私钥的存储位置。

$SERVER["socket"] == "[::]:80" { }
$SERVER["socket"] ==     ":443" { ssl.engine = "enable" }
$SERVER["socket"] == "[::]:443" { ssl.engine = "enable" }
ssl.privkey = "/etc/lighttpd/server.key"
ssl.pemfile = "/etc/lighttpd/server.pem"
ssl.openssl.ssl-conf-cmd = ("MinProtocol" => "TLSv1.3")
ssl.openssl.ssl-conf-cmd += ("Options" => "-ServerPreference")

重启 lighttpd

rc-service lighttpd restart

生成证书和密钥

可以使用 openssl 生成公钥和证书以及私钥,或者使用安装 ACF 生成的密钥。 您不需要两者都做,只需做一个即可。 前一种使用 OpenSSL 的方法是首选,因为它提供了更大的控制权。

使用 openssl 生成自签名证书

要生成证书,需要 openssl。

apk add openssl

更改到 lighttpd 配置目录

cd /etc/lighttpd

使用下面的命令,将生成自签名证书和密钥对。 在撰写本文时,建议的最小密钥为 2048 位,因此我们在命令中使用 '-newkey rsa:2048'。 更改以适合您的需求。 回答所有问题。

openssl req -newkey rsa:2048 -x509 -keyout server.key -out server.pem -days 365 -nodes

调整权限

chmod 400 /etc/lighttpd/server.pem

使用 acf 生成自签名证书

安装 ACF

setup-acf

将生成的证书复制到 lighttpd 配置目录。

mv /etc/ssl/mini_httpd/server.pem /etc/lighttpd/server.pem

调整权限

chown root:root /etc/lighttpd/server.pem

chmod 400 /etc/lighttpd/server.pem

不再需要 mini_http。

rc-service mini_httpd stop && rc-update del mini_httpd

移除 mini_http 软件包

apk del mini_httpd

将 HTTP 重定向到 HTTPS

任何通过 HTTP(默认情况下为 TCP 端口 80)对服务器的请求都将被重定向到 HTTPS(端口 443)

## Ensure mod_redirect is enabled!
server.modules              = (
                                "mod_redirect",                                    
)

$SERVER["socket"] == ":80" {
  $HTTP["host"] =~ "(.*)" {
    url.redirect = ( "^/(.*)" => "https://%1/$1" )
  }
}

更多细节