通过 WEB 实现 kerberos 密码修改

待处理

增加 Python 实现

@2013-11-06 新版功能: 创建

@2019-02-19 版后已移除: 使用 Python 能更方便的实现

使用 LDAP + Kerberos 实现集中用户认证及授权系统 里我们采用 Kerberos 来实现认证系统。接下来的一个需求是如何让用户方便的进行密码的修改。

在 Linux 系统上如果配置了 PAM 使用 pam_krb5 来进行认证(示例配置文件如下), 在用户成功登录到该系统可以通过命令 kpasswd (如果合适的配置了 /etc/pam.d/passwd 文件,通过命令 passwd 也可以)来进行密码修改。

# more /etc/pam.d/system-auth
auth            required        pam_env.so
auth            sufficient      pam_krb5.so
auth            required        pam_unix.so try_first_pass likeauth nullok
auth            optional        pam_permit.so

account         sufficient      pam_krb5.so
account         required        pam_unix.so
account         optional        pam_permit.so

password        required        pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password        sufficient      pam_krb5.so
password        required        pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password        optional        pam_permit.so

session         required        pam_limits.so
session         required        pam_env.so
session         sufficient      pam_krb5.so
session         required        pam_unix.so
session         optional        pam_permit.so

但在某些情况下用户可能无法通过 kpasswd 命令行来执行操作。此外,对于非技术人员 来说,让用户通过命令行来操作也可能会遇到很多支持上的问题,因此能让用户通过 WEB 界面来修改密码是比较方便的。乍一看,这个问题很简单。但如果在 Kerberos 里配置了 密码策略,新的密码也可能要满足策略要求,如密码的最小长度,需要包含的字符类别数 目限制,密码重复的次数等。在密码修改界面里重复实现这一套逻辑会费时费力。更严重 的是,用户修改密码时其密码可能已经过期从而无法通过认证(kpasswd 命令在密码过期 时会要求用户重新设置新密码),因此基于 WEB 的密码修改程序也得遵循 Kerberos 协议。幸运的是,已经有一个软件提供了基于 WEB 的解决方案,即 WebAuth。下面描述其安装过程。

  1. 在 WebAuth 官网下载源代码后编译。./configure --enable-perl && make

  2. 拷贝编译后的目录里的动态库代码到系统目录下。cp -ar lib/.libs/libwebauth.so* /usr/lib64/ && ./perl/Build install

  3. 拷贝 weblogin 目录下的 pwchange.fcgi 和其他模板文件到某个目录,如 /home/web/pwchange

  4. 执行 pwchange.fcgi 并根据出错信息安装相应的 perl 扩展库(cpan -i ...), 确保 pwchange.fcgi 能正常运行,其输出结果为 HTTP 响应数据, 包含响应头和 HTTP 正文文本。

  5. 安装 spawnfcgi 和 fcgiwrap 程序 emerge -avgk fcgiwrap spawnfcgi

  6. 新增服务 ln -s /etc/init.d/spawnfcgi /etc/init.d/spawnfcgi.fcgiwrap,并 配置 /etc/conf.d/spawn-fcgi.fcgiwrap 如下:

    FCGI_SOCKET=/var/run/fcgiwrap.sock
    FCGI_PORT=
    FCGI_PROGRAM=/usr/sbin/fcgiwrap
    FCGI_CHILDREN=1
    FCGI_USER=nginx
    FCGI_GROUP=nginx
    ALLOWED_ENV="PATH"
    
  7. 配置 nginx 如下:

    location ~ ^/auth/pwchange* {
          alias /home/web/pwchange;
          rewrite ^/auth/pwchange /pwchange.fcgi break;
          include fastcgi.conf;
          fastcgi_param DOCUMENT_ROOT /home/web/pwchange;
          fastcgi_param SCRIPT_NAME   pwchange.fcgi;
          fastcgi_pass unix:///var/run/fcgiwrap.sock-1;
    }
    
  8. 配置文件 /etc/webkdc/webkdc.conf

    $KEYRING_PATH = "/etc/webkdc/webkdc.keyring";
    
  9. 使用 WebAuth 软件源代码里的 wa_keyring 程序生成 webkdc.conf 里指定的文件。 ./tools/wa_keyring -f /etc/webkdc/webkdc.keyring add 0d。调整 webkdc.keyring 文件权限,让 fcgiwrap 程序执行时有权限访问该文件。

  10. 启动 spawnfcgi.fcgiwrap 和 nginx 服务。测试 pwchange 服务是否能正常工作。

  11. 如果有问题则通过 strace 以及其他相关服务的日志文件分析排查。

  12. 调整相关的 web 表单模板。