在我工作的地方,我们确实需要一个团队密码管理器,它可以与团队成员添加的任何密码保持同步。除此之外,我们需要它受到 LDAP 身份验证和自托管的保护(我个人不能信任任何基于云的密码管理器)。

可悲的是,大多数提供自托管和 LDAP 身份验证的基于 Web 的开源密码管理器都是付费的。

配方

幸运的是我(和你),我们可以使用以下免费和开源应用程序构建我们想要的东西:

  • Apache Httpd 2.4

  • 个 Apache LDAP 和 WebDAV 模块

  • KeeWebhttps://keeweb.info/由惊人的@antelle

我们都知道 Apache httpd 和它的 mods 是什么,但是让我们来谈谈 KeeWeb(Github repo):

它基本上是用 HTML/CSS 和 JavaScript 编写的,它基于KeePass,因此您几乎可以获得 KeePass 桌面应用程序的所有功能。

它会在浏览器本地解密您的 .kdbx 数据库,因此安全性++ ;)

它会尽可能使用浏览器缓存,因此在重新部署应用程序时请注意这一点。

是时候弄脏你的手了!

我们将在 Apache httpd Web 服务器上部署 KeeWeb,我们将配置 KeeWeb 以使用 WebDAV 协议查找托管在同一服务器上的 .kdbx 数据库,最后,我们将通过配置 Apache LDAP 来保护对网站的访问模块。

我将在 CentOS 7 上工作,因此某些命令可能会因您的操作系统而异。

因此,让我们从安装 Apache httpd 开始吧。

sudo yum install -y httpd

CentOS 上的 Apache 会自动加载我们将在配置中使用的必要模块,所以不用担心。

接下来,我们要获取 KeeWeb 应用程序的资源:

1.下载gh-pages分支内容:

wget https://github.com/keeweb/keeweb/archive/gh-pages.zip

  1. 在你的 HTTP 服务器的根目录下解压。

sudo unzip gh-pages.zip -d /var/www/html/

3.你应该有一个文件夹/var/www/html/keeweb-gh-pages,我们把它的内容移到父文件夹:

sudo mv /var/www/html/keeweb-gh-pages/* /var/www/html/ && sudo rmdir /var/www/html/keeweb-gh-pages/

然后chown -R apache.apache /var/www/html/

  1. 接下来,我们要为 KeeWeb 编写一个虚拟主机:

sudo vim /etc/httpd/conf.d/01-default.conf

这是我的完整虚拟主机配置文件,我们假设.kdbx 数据库文件将存储在我们网站的webdav文件夹中。

DavLockDB "/var/www/html/webdav/DavLock"

<VirtualHost *:80>
  DocumentRoot "/var/www/html"

  # According to the dev of KeeWeb, OPTIONS request must work without authorization. So we'll keep it outside the following location tags
  RewriteEngine on
  RewriteCond %{REQUEST_METHOD} OPTIONS
  RewriteRule ^(.*)$ blank.html [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]

  # If your Apache is behind a load-balancer, and the SSL certificate is handled by the Load-balancer, leave this.
  RequestHeader edit Destination ^https: http: early

  # Don't require LDAP authentication for a healthcheck
  SetEnvIf Request_URI "^/healhcheck" accessgranted=1

  <Location />
    Order deny,allow
    Satisfy any
    Deny from all
    Allow from env=accessgranted
    AuthName "LDAP Authentication"
    AuthType Basic
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://your-ldap-url:389/dc=example,dc=com?uid"
    AuthLDAPBindDN ${Your-ldap-bind-dn}
    AuthLDAPBindPassword ${Your-ldap-bind-password}
    AuthLDAPGroupAttribute ${Your-ldap-membership-attribute}
    AuthLDAPGroupAttributeIsDN off
    Require ldap-group ${The-ldap-group-dn-you-require-your-users-to-belong-to}
  </Location>

  <Location "/webdav">
    DAV On
    AuthType "Basic"
    AuthName "webdav"
    Options Indexes
    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Headers "origin, content-type, cache-control, accept, authorization, if-match, destination, overwrite"
    Header always set Access-Control-Expose-Headers "ETag"
    Header always set Access-Control-Allow-Methods "GET, HEAD, POST, PUT, OPTIONS, MOVE, DELETE, COPY, LOCK, UNLOCK"
    Header always set Access-Control-Allow-Credentials "true"
  </Location>

  # Logs
  ErrorLog /dev/stderr
  CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/apache_access.log.%Y-%m-%d 86400" combined
</VirtualHost>

快速解释

DavLockDB "/var/www/html/webdav/DavLock"是 Apache 使用的锁定文件,用于当我们的服务器接收 LOCK 或 UNLOCK 请求以处理写入并发时。

RequestHeader edit Destination ^https: http: early如果您的 Apache 在负载均衡器后面,并且 SSL 证书由负载均衡器处理,请保留此选项。

SetEnvIf Request_URI "^/healhcheck" accessgranted=1如果您需要一个不受 LDAP 保护的健康检查 URI,请设置一个变量accessgranted=1并确保在检查 LDAP 身份验证的标记内添加Allow from env=accessgranted

然后是检查 LDAP 身份验证和授权的经典位置标记,这里我们确保用户属于指定的 LDAP 组。如果您不需要用户属于特定组,则可以在互联网上找到大量有关如何执行此操作的示例;):

<Location />
    Order deny,allow
    Satisfy any
    Deny from all
    Allow from env=accessgranted
    AuthName "LDAP Authentication"
    AuthType Basic
    AuthBasicProvider ldap
    AuthLDAPURL "ldap://your-ldap-url:389/dc=example,dc=com?uid"
    AuthLDAPBindDN ${Your-ldap-bind-dn}
    AuthLDAPBindPassword ${Your-ldap-bind-password}
    AuthLDAPGroupAttribute ${Your-ldap-membership-attribute}
    AuthLDAPGroupAttributeIsDN off
    Require ldap-group ${The-ldap-group-dn-you-require-your-users-to-belong-to}
  </Location>

然后是一个经典的位置标签来配置 WebDav:

 <Location "/webdav">
    DAV On
    AuthType "Basic"
    AuthName "webdav"
    Options Indexes
    Header always set Access-Control-Allow-Origin "*"
    Header always set Access-Control-Allow-Headers "origin, content-type, cache-control, accept, authorization, if-match, destination, overwrite"
    Header always set Access-Control-Expose-Headers "ETag"
    Header always set Access-Control-Allow-Methods "GET, HEAD, POST, PUT, OPTIONS, MOVE, DELETE, COPY, LOCK, UNLOCK"
    Header always set Access-Control-Allow-Credentials "true"
  </Location>

如果您还没有 .kdbx 文件,我建议使用 Keepass 2 桌面应用程序创建一个,并将其复制到 /webdav 文件夹中。

前往您的浏览器,并使用您的 LDAP 凭据进行身份验证,您现在应该会看到 KeeWeb 应用程序!您可以通过单击更多来选择 webdav 方法,然后填写 .kdbx 文件的路径,在我们的例子中是https://www.example.com/webdav/database.kdbx。我们没有设置任何 webdav 用户或密码,所以点击确定然后输入主密码,瞧!

应用配置

不要太快,我们不希望我们的用户每次想要访问应用程序时都经历所有这些爵士乐......

index.html中,找到元标记kw-config并确保属性content的值为config.json,我们稍后会创建此文件。

整个 html 元标记如下所示:

<meta name="kw-config" content="config.json">

接下来,在您网站的根目录创建一个名为config.json的文件,并从此处的中填写您需要的配置。我的配置文件如下所示:

{
    "settings": {
        "theme": "fb",
        "autoSave": true,
        "autoSaveInterval": 1,
        "canOpenDemo": false,
        "dropbox": false,
        "gdrive": false,
        "onedrive": false,
        "canExportXml": false
    },
    "files": [{
        "storage": "webdav",
        "name": "Database",
        "path": "/webdav/database.kdbx"
    }]
}

确保删除浏览器缓存,您就完成了!

最后的话

这个 Web 应用程序的缺点是我们不能将 ACL 应用于密码管理器中的每个条目,因此它可能无法在工作中被许多团队共享。如果您有任何问题,我很乐意提供帮助。

注:本文首发于我的个人博客:https://www.zaine.me/

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐