Fail2Ban 如何保护 Linux 服务器上的服务

2023-11-15

介绍

SSH 是连接云服务器的事实上的方法。它耐用且可扩展——随着新的加密标准的开发,它们可用于生成新的 SSH 密钥,确保核心协议保持安全。然而,没有任何协议或软件堆栈是完全万无一失的,SSH 在互联网上如此广泛的部署意味着它代表了一种非常可预测的方式。攻击面 or 攻击向量人们可以通过它尝试获得访问权限。

任何暴露于网络的服务都是这种方式的潜在目标。如果您查看在任何流量广泛的服务器上运行的 SSH 服务的日志,您经常会看到重复的、系统性的登录尝试,这些尝试代表用户和机器人的暴力攻击。尽管您可以对 SSH 服务进行一些优化,以将这些攻击成功的几率降低到接近于零,例如禁用密码身份验证以支持 SSH 密钥,他们仍然可能构成轻微的、持续的责任。

对于大规模生产部署来说,这种责任是完全不可接受的,通常会实施 VPN,例如线卫在他们的 SSH 服务前面,因此如果没有额外的软件抽象或网关,就不可能从外部互联网直接连接到默认的 SSH 端口 22。这些 VPN 解决方案受到广泛信任,但会增加复杂性,并且可能破坏一些自动化或其他小软件挂钩。

在进行完整的 VPN 设置之前或之外,您可以实施一个名为Fail2ban。 Fail2ban 可以通过创建规则来显着减轻暴力攻击,这些规则会在一定次数的不成功登录尝试后自动更改防火墙配置以禁止特定 IP。这将使您的服务器能够针对这些访问尝试进行自我强化,而无需您的干预。

在另一个教程中,我们讨论了如何使用 Fail2ban 保护 SSH。在本指南中,我们将更深入地讨论 Fail2ban 的实际工作原理以及如何使用这些知识来修改或扩展该服务的行为。

Fail2ban 的基础知识

Fail2ban 的目的是监视公共服务的日志,以发现身份验证失败的模式。

当fail2ban配置为监视服务的日志时,它会查看filter已针对该服务进行特定配置。该过滤器旨在通过使用复杂的正则表达式来识别该特定服务的身份验证失败。正则表达式是一个用于模式匹配的通用模板语言。它将这些正则表达式模式定义到一个名为的内部变量中failregex.

默认情况下,Fail2ban 包含常用服务的过滤器文件。当来自任何服务(例如 Web 服务器)的日志与failregex在其过滤器中,为该服务执行预定义的操作。这action是一个变量,可以配置为执行许多不同的操作,具体取决于管理员的偏好。

默认操作是通过修改本地防火墙规则来禁止违规主机/IP 地址。您可以扩展此操作,例如向系统管理员发送电子邮件。

默认情况下,10 分钟内检测到 3 次身份验证失败后将采取行动,默认禁止时间为 10 分钟。这是可配置的。

使用默认值时iptables防火墙,fail2ban当服务启动时,创建一组新的防火墙规则,也称为链。它向 INPUT 链添加了一条新规则,将所有指向端口 22 的 TCP 流量发送到新链。在新链中,它插入一条返回到 INPUT 链的规则。如果 Fail2ban 服务停止,则链和关联规则将被删除。

探索 Fail2ban 服务设置

Fail2ban 是通过位于以下层次结构中的多个文件进行配置的/etc/fail2ban/目录。

The fail2ban.conffile 配置一些操作设置,例如守护进程记录信息的方式,以及它将使用的套接字和 pid 文件。然而,主要配置是在定义每个应用程序“jails”的文件中指定的。

默认情况下,fail2ban 附带一个jail.conf文件。但是,这可能会在更新中被覆盖,因此您应该将此文件复制到jail.local文件并在那里进行调整。

如果您已经有jail.local文件,使用打开它nano或您最喜欢的文本编辑器:

  1. sudo nano/etc/fail2ban/jail.local

如果您没有jail.local文件已经存在,或者您打开的文件是空白的,请复制jail.conf文件,然后打开新文件:

  1. sudo cp/etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  2. sudo nano/etc/fail2ban/jail.local

我们将看一下此处可用的选项,并了解该文件如何与系统上的其他配置文件交互。

默认部分

文件的第一部分将定义fail2ban 策略的默认值。这些选项可以在每个单独服务的配置部分中被覆盖。

删除注释后,整个默认部分看起来像这样:

/etc/fail2ban/jail.local
[DEFAULT]

ignoreip = 127.0.0.1/8
bantime = 10m
findtime = 10m
maxretry = 3
backend = auto
usedns = warn
destemail = root@localhost
sendername = Fail2Ban
banaction = iptables-multiport
mta = sendmail
protocol = tcp
chain = INPUT
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s", sendername="%(sendername)s"]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
            %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s", sendername="%(sendername)s"]
action = %(action_)s

让我们看一下其中的一些含义:

  • ignoreip:此参数标识应被禁止系统忽略的 IP 地址。默认情况下,这只是设置为忽略来自机器本身的流量,这样您就不会填写自己的日志或将自己锁定。
  • bantime:该参数设置禁止的长度,以秒为单位。默认值为 10 分钟。
  • findtime:此参数设置 Fail2ban 在查找重复失败的身份验证尝试时将关注的窗口。默认设置为10分钟,这意味着软件会统计最近10分钟内失败的尝试次数。
  • maxretry:这设置了在允许的时间内允许的失败尝试次数。findtime实施禁令之前的窗口。
  • backend:此条目指定 Fail2ban 如何监视日志文件。的设置auto意味着fail2ban会尝试pyinotify, then gamin,然后是基于可用内容的轮询算法。inotify是一个内置的 Linux 内核功能,用于跟踪文件何时被访问,以及pyinotify是一个Python接口inotify,由 Fail2ban 使用。
  • usedns:这定义了是否使用反向 DNS 来帮助实施禁令。将其设置为“no”将禁止 IP 本身,而不是其域名主机名。这warn设置将尝试查找主机名并禁止这种方式,但会记录活动以供审查。
  • 德斯特邮件:如果将您的操作配置为邮件警报,则这是将发送通知邮件的地址。
  • 发件人名称:这将在电子邮件发件人字段中用于生成通知电子邮件
  • 禁令:设置达到阈值时将使用的操作。这实际上是位于以下位置的文件的路径/etc/fail2ban/action.d/ called iptables-multiport.conf。这处理实际的iptables操纵防火墙来禁止某个 IP 地址。我们稍后会讨论这个。
  • mta:这是将用于发送通知电子邮件的邮件传输代理。
  • protocol:这是实施 IP 禁令时将丢弃的流量类型。这也是发送到新 iptables 链的流量类型。
  • chain:这是将配置跳转规则以将流量发送到fail2ban 漏斗的链。

其余参数定义可以指定的不同操作。它们使用文本字符串中的变量替换传入我们上面定义的一些参数,如下所示:

%(var_name)s

上面的行将替换为以下内容var_name。使用这个,我们可以知道action变量设置为action_默认定义(仅禁止,无邮件警报)。

反过来,这是通过调用iptables-multiport带有执行禁止所需的参数列表(服务名称、端口、协议和链)的操作。这__name__替换为下面部分标题指定的服务名称。

服务特定部分

在默认部分下方,有一些针对特定服务的部分,可用于覆盖默认设置。这遵循仅修改与正常值不同的参数的约定(约定优于配置)。

每个节标题的指定如下:

[service_name]

任何有该行的部分enabled = true将被读取并启用。

在每个部分中,都会配置参数,包括用于解析日志的过滤器文件(减去文件扩展名)以及日志文件本身的位置。

请记住这一点,指定 SSH 服务操作的部分如下所示:

/etc/fail2ban/jail.local
[SSH]

enabled     = true
port        = ssh
filter      = sshd
logpath     = /var/log/auth.log
maxretry    = 6

这将启用此部分并将端口设置为默认的“ssh”端口(端口 22)。它告诉 Fail2ban 查看位于以下位置的日志/var/log/auth.log对于本节并使用中定义的过滤机制来解析日志/etc/fail2ban/filters.d目录中名为sshd.conf.

它需要的所有其他信息都取自定义在[DEFAULT]部分。例如,操作将设置为action_这将禁止使用有问题的 IP 地址iptables-multiportbanaction,它引用了一个名为iptables-multiport.conf在发现/etc/fail2ban/action.d.

正如您所看到的,[DEFAULT]部分应该是通用的和灵活的。使用参数替换以及提供合理默认值的参数将可以在必要时覆盖定义。

检查过滤器文件

为了了解我们的配置中发生了什么,我们需要了解过滤器和操作文件,它们完成了大部分工作。

过滤器文件将确定fail2ban 将在日志文件中查找的行,以识别违规特征。操作文件实现了所需的所有操作,从服务启动时构建防火墙结构,到添加和删除规则,以及服务停止时拆除防火墙结构。

让我们看看我们的 SSH 服务在上面的配置中调用的过滤器文件:

  1. sudo nano/etc/fail2ban/filter.d/sshd.conf
/etc/fail2ban/sshd.conf
[INCLUDES]

before = common.conf

[Definition]

_daemon = sshd
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from <HOST>( via \S+)?\s*$
        ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
        ^%(__prefix_line)sFailed \S+ for .*? from <HOST>(?: port \d*)?(?: ssh\d*)?(: (ruser .*|(\S+ ID \S+ \(serial \d+\) CA )?\S+ %(__md5hex)s(, client user ".*", client host ".*")?))?\s*$
        ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
        ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because listed in DenyUsers\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because not in any group\s*$
        ^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because a group is listed in DenyGroups\s*$
        ^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$
ignoreregex =

The [INCLUDES]节头指定在此文件之前或之后读入的其他过滤器文件。在我们的示例中,common.conf文件被读入并放置在该文件中的其他行之前。这设置了我们将在配置中使用的一些参数。

接下来,我们有一个[Definition]定义过滤器匹配的实际规则的部分。首先,我们使用以下命令设置正在监视的守护进程的名称_daemon范围。

之后我们再进行实际操作failregex定义,它设置在日志文件中找到匹配行时将触发的模式。这些是根据用户未正确进行身份验证时可能引发的不同错误和失败进行匹配的正则表达式。

该行的部分如%(__prefix_line)s将被替换为参数设置中的值common.conf我们获取的文件。这用于匹配操作系统在使用标准方法时写入日志文件的不同前导信息。例如,一些行来自/var/log/auth.log可能看起来像这样:

/var/log/auth.log
May  6 18:18:52 localhost sshd[3534]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.79.130.213 
May  6 18:18:54 localhost sshd[3534]: Failed password for invalid user phil from 101.79.130.213 port 38354 ssh2
May  6 18:18:54 localhost sshd[3534]: Received disconnect from 101.79.130.213: 11: Bye Bye [preauth]

突出显示的部分是操作系统插入以提供更多上下文的标准模式。之后,iptables 防火墙服务有多种不同的方式将失败尝试写入日志。

我们在上面的前两行中看到两个单独的失败(PAM 身份验证错误和密码错误)。过滤器中定义的正则表达式旨在匹配任何可能的失败行。您不必调整这些行中的任何一行,但您应该意识到,如果您必须自己创建过滤器文件,则需要捕获所有表示您要保护的应用程序出现未经授权使用错误的日志条目。

在底部,您可以看到一个ignoreregex参数,目前为空。这可用于排除通常与故障条件匹配的更具体的模式,以防您想要在某些情况下否定fail2ban 的故障触发器。我们不会对此进行调整。

检查完文件后保存并关闭该文件。

检查操作文件

现在,让我们看一下操作文件。该文件负责设置防火墙,其结构允许修改以禁止恶意主机,并根据需要添加和删除这些主机。

我们的 SSH 服务调用的操作称为iptables-multiport。现在打开关联文件:

  1. sudo nano/etc/fail2ban/action.d/iptables-multiport.conf

删除注释后,该文件看起来像这样:

/etc/fail2ban/action.d/iptables-multiport.conf
[INCLUDES]
before = iptables-blocktype.conf

[Definition]
actionstart = iptables -N fail2ban-<name>
                iptables -A fail2ban-<name> -j RETURN
                iptables -I <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

actionstop = iptables -D <chain> -p <protocol> -m multiport --dports <port> -j fail2ban-<name>

actioncheck = iptables -n -L <chain> | grep -a 'fail2ban-<name>[ \t]'

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype>

actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype>

[Init]
name = default
port = ssh
protocol = tcp
chain = INPUT

该文件首先获取另一个名为的操作文件iptables-blocktype.conf定义了blocktype参数,配置禁止客户端时设置的限制。默认情况下blocktype设置为拒绝数据包,并使用端口不可访问的拒绝消息回复被禁止的客户端发送的 ping。我们将在下面的禁令规则中使用它。

接下来,我们了解规则定义本身。这actionstartaction 在fail2ban 服务启动时设置 iptables 防火墙。它创建一条新链,向该链添加一条规则以返回到调用链,然后在 INPUT 链的开头插入一条规则,将与正确协议和端口目标匹配的流量传递到新链。

它通过使用我们传入的值来做到这一点action我们在我们的定义中定义了jail.local文件。这name取自每个服务的节标题。这chain, protocol, and port取自action将其本身写入该文件中。

在这里,通过将参数名称包含在尖括号中来引用其他文件设置的所有参数:

&lt;param_name&gt;

当我们向下移动到同伴处时actionstop定义,我们可以看到防火墙命令正在实现逆转actionstart命令。当 Fail2ban 服务停止时,它会彻底删除它添加的所有防火墙规则。

另一个动作称为actioncheck确保在尝试添加禁令规则之前已创建正确的链。

接下来,我们讨论实际的禁止规则,称为actionban。该规则的工作原理是向我们创建的链添加一条新规则。该规则与违规客户端的源 IP 地址相匹配 – 该参数是在以下情况下从授权日志中读取的:maxretry已达到限制。它建立了由以下定义的块blocktype我们在中获取的参数[INCLUDE]文件顶部的部分。

The actionunban规则删除此规则。当禁止时间过去后,fail2ban 会自动完成此操作。

最后,我们到达[Init]部分。这只是提供一些默认值,以防调用操作文件而不传入所有适当的值。

Fail2ban 服务如何处理配置文件以实施禁令

现在我们已经了解了具体细节,让我们回顾一下fail2ban 启动时发生的过程。

加载初始配置文件

一、主要fail2ban.conf读取文件以确定主进程应运行的条件。如果需要,它会创建套接字、pid 和日志文件并开始使用它们。

接下来,fail2ban 读取jail.conf文件以获取配置详细信息。接下来,它会按字母顺序读取在jail.d结尾为的目录.conf。它将这些文件中找到的设置添加到其内部配置中,使新值优先于中描述的值jail.conf file.

然后它会搜索一个jail.local文件并重复此过程,调整新值。最后,它搜索jail.d再次目录,按字母顺序读取以结尾的文件.local.

在我们的例子中,我们只有一个jail.conf文件和一个jail.local文件。在我们的jail.local文件中,我们只需要定义与jail.conf文件。 fail2ban 进程现在将一组指令加载到内存中,这些指令代表它找到的所有文件的组合。

它检查每个部分并搜索enabled = true指示。如果找到,它将使用该部分下定义的参数来构建策略并决定需要采取哪些操作。任何在服务部分中找不到的参数都使用在服务部分中定义的参数[DEFAULT]部分。

解析操作文件以确定启动操作

Fail2ban 寻找action指令来确定调用什么操作脚本来实施禁止/取消禁止政策。如果没有找到,它将退回到上面确定的默认操作。

操作指令包含将读取的操作文件的名称,以及传递这些文件所需参数的键值字典。这些值通常通过引用服务部分中配置的设置来采用参数替换的形式。 “name”键通常传递特殊的值__name__将被设置为节标题值的变量。

然后 Fail2ban 使用此信息在action.d目录。它首先查找以以下结尾的关联操作文件.conf然后使用随附的文件中包含的任何设置修改在那里找到的信息.local文件还发现在action.d目录。

它解析这些文件以确定需要采取的操作。它读取actionstart值以查看设置环境应采取的操作。这通常包括创建防火墙结构以适应未来的禁止规则。

该文件中定义的操作使用从action指示。它将使用这些值来动态创建适当的规则。如果未设置某个变量,它可以查看操作文件中设置的默认值来填补空白。

解析过滤文件以确定过滤规则

服务的参数在jail.*文件还包括日志文件的位置以及用于检查文件的轮询机制(这是由backend范围)。它还包括一个过滤器,用于确定日志中的行是否表示失败。

Fail2ban 看起来在filter.d目录查找以结尾的匹配过滤器文件.conf。它读取此文件来定义可用于匹配违规行的模式。然后它会搜索以结尾的匹配过滤器文件.local查看是否有任何默认参数被覆盖。

它在读取服务的日志文件时使用这些文件中定义的正则表达式。它尝试每一个failregex中定义的行filter.d文件针对写入服务日志文件的每个新行。

如果正则表达式返回匹配项,它将根据由定义的正则表达式检查该行ignoreregex。如果这也匹配,fail2ban 会忽略它。如果该行与中的表达式匹配failregex但与中的表达式不匹配ignoreregex,对于引起该线路的客户端,内部计数器会递增,并为该事件创建关联的时间戳。

由于设置的时间窗口findtime中的参数jail.*文件到达(由事件时间戳确定),内部计数器再次递减,并且该事件不再被视为与禁止策略相关。

如果随着时间的推移,记录了其他身份验证失败,则每次尝试都会增加计数器。如果计数器达到由maxretry参数在配置的时间窗口内,fail2ban 通过调用actioncheck中定义的服务操作action.d/服务的文件。这是为了判断是否actionstart行动建立了必要的结构。然后它调用actionban采取措施禁止违规客户。它还为此事件设置时间戳。

当指定的时间已经过去时bantime参数,fail2ban 通过调用取消禁止客户端actionunban action.

结论

现在您已经相当深入地了解了fail2ban 的运作方式。当您偏离标准配置时,了解fail2ban 的功能会很有帮助,以便以可预测的方式操纵其行为。

要了解如何使用fail2ban保护其他服务,您可以阅读如何在 Ubuntu 22.04 上使用 Fail2Ban 保护 Nginx 服务器.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fail2Ban 如何保护 Linux 服务器上的服务 的相关文章

  • 在 iOS 中保存加密密钥的安全方法

    在我的 iOS4 应用程序中 我在多个地方使用 AES 加密 整个应用程序必须非常安全 为了做到这一点 我必须在这个应用程序中硬编码几个密钥 然后当我需要加密某些东西时随机选择这些密钥 我的问题是如何存储这些私钥 使用硬编码它们是否安全NS
  • 上传文件最安全的方法是什么?

    我工作的公司最近在我们托管的网站上遭受了许多标头注入和文件上传漏洞攻击 虽然我们已经解决了标头注入攻击的问题 但我们尚未控制上传漏洞 我正在尝试设置一系列即插即用类型的上传脚本以供内部使用 设计人员可以将其复制到其网站的结构中 修改一些变量
  • 安全沙箱违规

    运行我的 Flash 应用程序时出现以下错误 违反安全沙箱 与 rtmp system ip live 的连接已停止 不允许从 file F Flash 工作 RTS RT vlab BIOTECH NEO 简单神经元的被动属性 vi 特征
  • 在VS2008中,对于网站的FTP发布,有没有办法保存FTP登录密码?

    我喜欢 Visual Studio 2008 IDE 集成 非命令行 功能 可以选择通过 FTP 将 ASP NET 网站发布到我的网络服务器 我可以存储我的 FTP 用户名 但没有看到任何存储我的 FTP 密码的选项 因此我每次发布时都必
  • 允许用户将自己的 JavaScript 添加到您的网站是否存在安全问题?

    我计划创建一个开源教育网络应用程序 人们可以在其中添加和编辑内容 有点像维基百科 不过 我希望添加另一个功能 允许用户使用 JavaScript 添加自己的交互式内容 类似于 JSFiddle 的做法 这样做有哪些安全问题 可选问题 如何克
  • 基本身份验证:是否可以像 getRemoteUser() 一样设置RemoteUser

    您好 我正在使用基本身份验证方法来保护我的 Web 应用程序中的某些页面 其中有指定的 url 模式如下
  • 使用端口 80 (Ubuntu / Linode) 运行 Node.js 的最佳实践 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在设置我的第一个Node js服务器上的cloud Linux node我对以下细节还很陌生Linux admin 顺便说一句 我并没有尝试
  • PHP - 停止显示错误中的完整路径

    有什么方法可以告诉 PHP 不显示错误 警告或通知消息中存在任何错误的文件的完整路径 我知道我可以禁用错误 但是 只是为了避免任何风险 例如 我的脚本返回一个错误 显示如下 Fatal error Call to undefined fun
  • 使用 global-method-security,访问被拒绝错误将作为 HTTP 500 错误返回

    我尝试使用 Spring Security Annotations 来确保安全 而不是在 XML 中定义规则 它似乎有效 但是当我遇到访问被拒绝错误时 我收到返回的 HTTP 状态代码 500 我在 tomcat 日志文件中没有看到任何异常
  • 使用自己的网络服务器实现一致的安全 Google Play 应用内购买场景

    我已多次阅读了中的所有文档Android 开发者指南 http developer android com guide google play billing index html并熟悉了精彩的 Google 演示躲避海盗并阻止吸血鬼 ht
  • 如何在 Jboss 7.1 中配置简单身份验证

    我正在从事由以下人员编写的项目纯jsps 脚本 不使用任何框架 jboss版本 jboss as 7 1 0 Final 我现在正在尝试在其上添加简单的身份验证 因此 当用户尝试浏览 jsp 时 比如说 http localhost myC
  • antisamy 解析器强制关闭标签

    我使用 Antisamy 来验证 HTML 我的政策允许 iframe 例如 YouTube 视频 问题是 如果标签为空 像这样 清洗后会是这样的 但它应该有正常的结束标签 这会破坏之后页面上的所有内容 我已经将指令设置为使用大部分 HTM
  • PHP cookie 和会员安全

    我创建了一个论坛 该论坛在登录时使用 PHP 会话来确定用户 ID 并使用 cookie 来进行日志登录 我想我有两个问题 这是最好 最安全的方法吗 可以使用javascript通过地址栏手动添加cookie 这是一个巨大的安全风险 有没有
  • JSON 响应周围的注释块

    我注意到一些 Web 应用程序返回 AJAX 响应 并在注释块中嵌入 JSON 数据 例如 这是一个示例响应 firstName John lastName Smith address streetAddress 21 2nd Street
  • 加密成本高,解密成本低

    我希望该用户 攻击者加密数据并发送给服务器 现在我想要一种与标准算法完全相反的算法 使用快 难以解密 即很难使用服务器发送的密钥来加密密码等数据 以防止随机攻击 但很容易解密这样服务器在验证用户时消耗的时间非常少 但是对于攻击者来说 每次使
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 普罗米修斯警报中缺少标签

    我对 Prometheus 警报规则有疑问 我设置了各种 cAdvisor 特定警报 例如 alert ContainerCpuUsage expr sum rate container cpu usage seconds total 3m
  • 用户如何登录定义了读者角色的 couchapp?

    我通过 Couchapp 部署了我的应用程序 这意味着整个应用程序是从数据库中提供服务的 我不希望 Couchdb 数据库中的数据公开可用 因此我指定了用户在向他提供数据之前必须具有的读者角色 然而 当我去申请时 我所能得到的是 error
  • 未捕获的安全错误:阻止了具有原点的框架...访问具有原点的框架

    我已经为 SAP 解决方案 无论什么 制作了一个组件 该组件通过 iframe 嵌入到报告中 在 SAP 平台 BO 上部署报告后 我收到此错误 在 Chrome 上 但在 IE 或 FF 上也不起作用 Uncaught SecurityE
  • 如何列出静态链接的 python 版本中可用的所有 openssl 密码?

    在python 2 7 8到2 7 9升级中 ssl模块从使用更改为 DEFAULT CIPHERS DEFAULT aNULL eNULL LOW EXPORT SSLv2 to DEFAULT CIPHERS ECDH AESGCM D

随机推荐

  • 如何在 Ubuntu 20.04 上添加和删除用户

    配置新 Ubuntu 系统时的首要任务之一是添加和删除用户 每个用户可以对各种命令行和 GUI 应用程序拥有不同的权限级别和特定设置 本文介绍如何在 Ubuntu 18 04 上添加和删除用户帐户 在你开始之前 仅 root 或具有 sud
  • 如何在 Raspberry Pi 上安装 Plex 媒体服务器

    Raspberry Pi 可用于许多不同的项目 Raspberry Pi 最受欢迎的用例之一是将 Raspberry Pi 变成家庭媒体中心 Plex 是一款流行的流媒体服务器 可让您组织视频 音乐和照片收藏 并将它们随时随地流式传输到您的
  • 如何在 Ubuntu 18.04 上安装 Node.js 和 npm

    Node js 是一个开源跨平台 JavaScript 运行时环境 允许服务器端执行 JavaScript 代码 这意味着您可以在计算机上将 JavaScript 代码作为独立应用程序运行 无需使用任何 Web 浏览器 Node js 主要
  • 如何在 CentOS 7 上部署 Mattermost

    Mattermost 是一个开源即时通讯平台 是一个自托管的 Slack 替代品 它是用 Golang 和 React 编写的 可以使用 MySQL 或 PostgreSQL 作为数据库后端 Mattermost 将您的所有团队沟通集中到一
  • 如何在 CentOS 7 上安装 Plex 媒体服务器

    Plex 是一款流媒体服务器 可将您所有的视频 音乐和照片收藏集中在一起 并随时随地将它们流式传输到您的设备 在本教程中 我们将向您展示如何安装和配置Plex 媒体服务器在 CentOS 7 上 先决条件 在继续本教程之前 请确保您以以下身
  • Linux 中的 df 命令(检查磁盘空间)

    我的硬盘还剩多少空间 是否有足够的可用磁盘空间来下载大文件或安装新应用程序 在 Linux 和 Unix 操作系统上 您可以使用df命令获取有关系统磁盘空间使用情况的详细报告 使用 df 命令 的一般语法为df命令如下 df OPTIONS
  • 如何在 CentOS 8 上安装 Node.js 和 npm

    Node js 是一个基于 Chrome JavaScript 构建的跨平台 JavaScript 运行时环境 旨在在服务器端执行 JavaScript 代码 使用 Node js 您可以构建可扩展的网络应用程序 npm 是 Node Pa
  • 如何在 Debian 9 上安装 Webmin

    Webmin是一个用于管理 Linux 服务器的开源 Web 控制面板 使用 Webmin 您可以管理系统用户 组 磁盘配额以及配置最流行的服务 包括 Web ssh ftp 电子邮件和数据库服务器 本教程介绍如何在 Debian Linu
  • 如何在 Debian 11 上为专用连接设置 Squid 代理

    介绍 代理服务器是一种服务器应用程序 充当最终用户和互联网资源之间的网关 通过代理服务器 最终用户能够出于多种目的控制和监视其 Web 流量 包括隐私 安全和缓存 例如 您可以使用代理服务器从与您自己的 IP 地址不同的 IP 地址发出 W
  • 如何在 Ubuntu 16.04 上安装 MySQL

    介绍 MySQL是一个开源数据库管理系统 通常作为流行的一部分安装LAMP Linux Apache MySQL PHP Python Perl 堆栈 它使用关系数据库和 SQL 结构化查询语言 来管理其数据 简短版本的安装很简单 更新您的
  • Java IO 教程

    Java提供了几个类java io用于处理文本 流数据和文件系统的包 我最近提供了几个有关 Java 文件和 Java IO 的示例 这篇文章是所有 Java IO 文章的索引 Java IO 如何在 Java 中创建新文件在这篇文章中 您
  • Java Stream Collect() 方法示例

    Java Streamcollect 对流的元素执行可变归约操作 这是终端操作 什么是可变约简操作 可变归约操作处理流元素 然后将其累积到可变结果容器中 处理元素后 组合函数将合并所有结果容器以创建结果 Java Stream Collec
  • 快速初始化()

    在本 Swift 教程中 我们将讨论一个重要的概念 即 Swift init 或 Swift 初始化 初始化是当我们创建某种类型的实例时发生的事情 快速初始化 初始化是准备类 结构或枚举的实例以供使用的过程 此过程涉及为该实例上的每个存储属
  • 如何在 Debian Wheezy 上使用 Postfix 安装和配置 DKIM

    介绍 对于大多数邮件服务器管理员来说 被错误地标记为垃圾邮件发送者所带来的挫败感并不奇怪 通过排除服务器受损的可能性 错误标记通常是由以下原因之一引起的 该服务器是一个开放的邮件中继 发件人或服务器的 IP 地址已列入黑名单 服务器没有完全
  • Linux/Unix 中的 AWK 命令

    AWK 适用于模式搜索和处理 该脚本运行以搜索一个或多个文件以识别匹配模式以及所述模式是否执行特定任务 在本指南中 我们将了解 AWK Linux 命令并了解它的功能 AWK 可以执行哪些操作 逐行扫描文件 将每个输入行拆分为字段 将输入行
  • 如何在 Python 中将字符串转换为日期时间或时间对象

    介绍 蟒蛇datetime and time模块均包括strptime 将字符串转换为对象的类方法 在本文中 您将使用strptime 将字符串转换为datetime and struct time 对象 将字符串转换为datetime对象
  • 如何在 Ubuntu 18.04 上使用 Python 3 设置 Jupyter Notebook

    介绍 Jupyter笔记本是一个开源 Web 应用程序 可让您创建和共享交互式代码 可视化等 该工具可与多种编程语言一起使用 包括 Python Julia R Haskell 和 Ruby 它通常用于处理数据 统计建模和机器学习 本教程将
  • 了解 Vue.js 生命周期挂钩

    介绍 生命周期挂钩是了解您正在使用的库如何在幕后工作的窗口 生命周期钩子允许您知道组件何时被创建 添加到 DOM 更新或销毁 本文将向您介绍 Vue js 中的创建 安装 更新和销毁钩子 先决条件 要完成本教程 您需要 熟悉 Vue js
  • Java 单例类中的线程安全

    Singleton 是最广泛使用的创建型设计模式之一 用于限制应用程序创建的对象 如果是在多线程环境中使用 那么单例类的线程安全性就非常重要 在现实应用程序中 数据库连接或企业信息系统 EIS 等资源是有限的 应明智地使用以避免任何资源紧缩
  • Fail2Ban 如何保护 Linux 服务器上的服务

    介绍 SSH 是连接云服务器的事实上的方法 它耐用且可扩展 随着新的加密标准的开发 它们可用于生成新的 SSH 密钥 确保核心协议保持安全 然而 没有任何协议或软件堆栈是完全万无一失的 SSH 在互联网上如此广泛的部署意味着它代表了一种非常