Apache htpasswd 安全密码更改

2023-12-19

我的问题很简单。

如何允许用户更改存储在Linux中的某些htpasswd文件中的密码而不泄露文件内容或允许用户修改其他密码?

我尝试编写一个脚本来使用 ssh 和专门设计的用户来完成这项工作,但它没有成功。

请帮忙。 我正在使用 Debian 服务器“Lenny”。


阿帕奇人htpasswd文件不支持任何影子功能。因此,您必须阻止用户访问您的网络服务器,以使他们远离密码文件。因此,唯一的解决方案是基于 SSH 的方法或任何其他远程解决方案。下面的描述将解释如何编写 SSH 命令脚本来仅在用户知道其旧密码的情况下更改密码。主要问题是,Apache 不提供命令行工具来验证密码htpasswd文件。但这可以手工完成。

以下描述假设Web服务器用户是www-data用户的主目录是/var/www.

首先,您必须创建一个可由 Web 服务器用户写入的 htpasswd 文件:

# ls -la .htpasswd
-rw-r--r-- 1 www-data root 18 10. Mai 16:30 .htpasswd

然后您必须将所有用户的密钥添加到authorized_keysWeb 服务器用户的文件。您必须在每一行前面加上前缀command option.

# cat .ssh/authorized_keys 
command="/var/www/.htpasswd.sh" ssh-rsa AAAA... user@host

每当用户使用他的密钥连接时,仅.htpasswd.sh被处决。用户没有任何对 Web 服务器的 shell 访问权限。

这是更改密码的脚本:

#! /bin/bash

HTPASSWD=/var/www/.htpasswd

die () { echo "$*" >&2 ; exit 1 ; }

read -p 'Enter user name: ' USER
read -s -p 'Old password: ' OLDPW ; echo
read -s -p 'New password: ' NEWPW0 ; echo
read -s -p 'Re-type new password: ' NEWPW1 ; echo

if LINE=$(grep ^"$USER": "$HTPASSWD")
then
    echo "$LINE" | sed 's/.*:\(..\)\(.\+\)/\1 \2/' | { 
        read SALT CRYPT
        if [[ "$SALT$CRYPT" = $(echo "$OLDPW" | mkpasswd -sS "$SALT") ]] ; then
            if [ "$NEWPW0" != "$NEWPW1" ] ; then
                die "Password verification error!"
            fi
            PWS=$(grep -v ^"$USER:" "$HTPASSWD")
            {
                echo "$PWS"
                echo -n "$USER:"
                echo "$NEWPW0" | mkpasswd -s
            } > "$HTPASSWD"
            echo "Updating password for user $USER."
        else
            die "Password verification error!"
        fi
    }
else
    die "Password verification error!"
fi

棘手的部分是密码验证。它是通过读取旧盐并用旧盐加密旧密码来完成的。将结果与旧的加密密码进行比较htpasswd file.

现在用户可以连接到 Web 服务器来更改密码:

$ ssh www-data@localhost
Enter user name: szi
Old password: 
New password: 
Re-type new password: 
Updating password for user szi.
Connection to localhost closed.

每个人只能更改自己的密码,没有人可以访问其他用户的加密密码。该解决方案还有一个关于使用原始解决方案的额外好处htpasswdshell 脚本中的程序,因为密码从不用作命令行参数。这是不可能的htpasswd,因为它无法从 stdin 读取密码,例如mkpasswd.

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

Apache htpasswd 安全密码更改 的相关文章

随机推荐

  • Python - IndexError:列表索引超出范围 - 不起作用

    这是我的 scrap py 代码 from bs4 import BeautifulSoup as soup from urllib request import urlopen as uReq website https houston
  • 圆圈的边框样式为刻度线

    我有一个带有虚线边框的圆圈 然而 边框应该更像垂直的破折号 而不是点 有没有办法用css使边框与设计完全相同 垂直虚线而不是粗实线 我想更改此类 OtherCaptionBorder My css caption circle positi
  • 使用 JsonConverter 的 Json.NET 自定义序列化 - 如何获得“默认”行为

    我的类 DataType 有一个 JsonConverter 当 Json 中使用纯字符串作为 DataType 类型的属性值时 我想进行一些特殊处理 在该值是 完整 对象的情况下 我想进行 正常 反序列化 这是我的尝试 public ov
  • print() 函数打印列表中每个元素的内容

    基本上 我正在尝试编写一个打印语句 该语句允许我在运行 driver java 时将每行的元素作为 println 打印为输出 我一生都不知道该怎么做 任何帮助将不胜感激 这是driver java public class Driver
  • 如何将 ANSEL 文本转换为 UTF-8

    如何在 C 中将 ANSEL 编码的文本更改为 UTF 8 这是一个重要的转换 因为 Windows NET Framework 没有 ANSEL 代码页 看here http www heiner eichmann de gedcom c
  • 实体框架登录失败错误

    我已经在 IIS 中托管了我的 WCF 应用程序 并设置了一个集成了 4 0 的应用程序池 我将池标识配置为网络服务 我已经检查了与此问题相关的其他帖子 但无法解决它 我得到以下异常 System Data Entity Core Enti
  • 混合地图类型图块的 Google 地图图块 URL?

    我找到了常规地图图块的基本 URL 结构 https mts1 google com vt lyrs m 186112443 hl x local src app x 1325 y 3143 z 13 s Galile 从 Google 获
  • SetProcessDpiAwareness 没有效果

    我一直在尝试禁用 ClickOnce 应用程序上的 DPI 感知 我很快发现 不可能在清单中指定它 因为 ClickOnce 不支持清单文件中的 asm v3 我发现的下一个选项是调用新的 Windows 函数设置进程Dpi感知 https
  • 为什么建议的 Swift 单例实现使用结构体?

    The 普遍接受的 Swift 单例模式 https stackoverflow com a 24024762 998117在类变量 类型属性中使用 Struct 代替 class MySingleton class var sharedI
  • 如何在opencart中自动选择结账选项?

    在我正在开发的商店中 用户只有创建帐户才能查看价格并将产品添加到购物车 之后 他们可以将产品添加到购物车 帐单详细信息和交付详细信息选项将自动填写用户的地址 送货方式免费 付款方式为 货到付款 我如何自动选择这些选项并隐藏它们 这样剩下的唯
  • 如何在 Keras 中使用 categorical_hinge?

    也许是一个非常愚蠢的问题 但我找不到如何在 Keras 中使用 categorical hinge 的示例 我进行分类 我的目标是shape 1 值为 1 0 1 所以我有 3 个类别 使用函数式 API 我设置了输出层 如下所示 输出 密
  • C# FluentScheduler 作业不重复

    我有一个简单的任务 我试图使用 FluentScheduler 重复执行 但我似乎无法让它正常运行 我对 工作 和 行动 完全陌生 所以我确信这是我没有考虑到的愚蠢的事情 我正在修改我原来的问题 因为提供的解决方案适用于控制台应用程序 但不
  • matlab中循环与矢量化的比较

    让我们考虑以下脉冲函数代码 function y impulse function n y 0 if n 0 y 1 end end 这段代码 gt gt n 2 2 gt gt i 1 length n gt gt f i impulse
  • 每次我打开对话框时,Microsoft Visual Studio 2019“服务器繁忙”。 Devenv.exe 与 textservice.dll 发生错误

    每次我打开对话框时 Microsoft Visual Studio 2019 都会显示 服务器繁忙 对话框 Procmon 搜索 devenv exe 发现以下文件至少有 100 个 NO SUCH FILE 条目 C Users jlav
  • 从字符串中删除重音字符 - Python

    我从网页获取一些数据并在 python 中像这样读取它 origional doc urllib2 urlopen url read 有时此网址包含以下字符 and and ect 我怎样才能从字符串中删除这些字符 现在这就是我正在尝试的
  • 这段树遍历代码的错误在哪里?

    有一个错误Traverse 这导致它多次迭代节点 被窃听的代码 public IEnumerable
  • CSS3 - 3D 立方体 - IE 变换样式:preserve-3d 解决方法

    浏览完 IE10 后开发者博客 http msdn microsoft com en gb library ie hh673529 28v vs 85 29 aspx the ms transform style property我发现他们
  • 在弹性搜索查询中将子项视为父项的字段

    我正在阅读 elasticsearch 的文档 此 page 1 讨论了如何使用将子项映射到父项类型 parent 如果我有孩子叫email依附于父母称为account 每种类型的字段 account http localhost 9200
  • 如何设置仅允许站点默认页面的robot.txt

    假设我有一个网站http example com http example com 我真的很想让机器人看到主页 但任何其他页面都需要被阻止 因为它对蜘蛛来说毫无意义 换句话说 http example com http example co
  • Apache htpasswd 安全密码更改

    我的问题很简单 如何允许用户更改存储在Linux中的某些htpasswd文件中的密码而不泄露文件内容或允许用户修改其他密码 我尝试编写一个脚本来使用 ssh 和专门设计的用户来完成这项工作 但它没有成功 请帮忙 我正在使用 Debian 服