我已经在 MongoDB Linux 服务器上应用了 kerberos 身份验证。现在我想在 NodeJS 应用程序中使用 mongodb 连接。所以我将它与连接字符串一起使用。在 Windows 本地运行良好。
当我在 docker 容器中运行它时,它会给出以下错误:
**未提供凭据,或者凭据不可用或无法访问:没有可用的 Kerberos 凭据(默认缓存:FILE:/tmp/krb5cc_0)
**
Dockerfile:
FROM node:yxchia01/node-kerberos:18.20.4-alpine
WORKDIR /app
COPY ./package.json ./
RUN apk add --no-cache --virtual build-dependencies make gcc g++ python3 && \
apk add --no-cache krb5-dev
ENV PYTHON /usr/bin/python3
RUN npm install --force
COPY ./ ./
#Copying keytab and krb5 file
COPY ./krb5.conf /etc/krb5.conf
COPY ./keytab.keytab /etc/keytab.keytab
RUN chmod 777 /etc/keytab.keytab
RUN chmod 777 /etc/krb5.conf
# Setting environment variables for Kerberos
ENV KRB5_CONFIG=/etc/krb5.conf
ENV KRB5_KTNAME=/etc/keytab.keytab
CMD ["npm", "run", "dockerStart"]
我尝试复制密钥表文件并授予所需的权限。使用的连接字符串:
mongodb://user_name@server_with_domain_name:27017/db_name?authMechanism=GSSAPI&authSource=$external
不要为客户端和服务器复制相同的密钥表文件。客户端应该有一个完全独立的 Kerberos 主体(没有 SPN 的 AD 帐户),并相应地为该帐户拥有一个单独的密钥表。
对于客户端,请使用
KRB5_CLIENT_KTNAME
而不是 KRB5_KTNAME
。后者仅指定“接受方”(服务器端)使用的 keytab,但如果您希望 Krb5 作为客户端(发起方)自动使用 keytab 获取票据,则需要指定 CLIENT_
keytab。
(客户端密钥表是 MIT Krb5 中相对较新的功能。您的 Docker 基础映像中应该已经支持它,但在过去,过去需要“手动”获取票证并使用
kstart
或 保持刷新kinit
。)