我的目标是运行一个Windows Docker容器,该容器可以通过Kerberos进行身份验证以访问Windows资源。为此,我镜像了一个适用于Linux容器的安装程序。我基于installs the most recent Kerberos MSI for Windows的winamd64 / python创建了一个Docker映像。它为我的用户*在密钥选项卡上运行kinit,并在我指定的缓存文件中成功生成票证。下面的代码段:
RUN cmd /c "type nul > /path/to/krbcache"
RUN cmd /c "setx KRB5_CONFIG C:\path\to\krb5.conf"
RUN cmd /c "setx KRB5CCNAME C:\path\to\krbcache"
WORKDIR /path/to/
RUN cmd /c "kinit -k -t myuser_keytab myuser@REALM"
当我执行到该容器时,我在krbcache文件中看到一张票,一切似乎都很棒。但是,当我运行klist时,看到以下错误:
A specified logon session does not exist. It may already have been terminated.
此外,当我执行一个正在运行的容器并运行kinit时,此操作成功。但是,如果我打开第二个shell并在同一个正在运行的容器中执行exec,klist报告一个不同的LogonId,并且不了解会话。
Exec1@ContainerA>klist
Current LogonId is 0:0x21fdb825
Cached Tickets: (0)
Exec2@ContainerA>klist
Current LogonId is 0:0x2210bba0
...
A specified logon session does not exist. It may already have been terminated.
几个问题:
为什么同一容器中每个exec cmd.exe的LogonId都不一样?
为什么密钥表成功地用于在工单缓存中生成工单,而klist从不显示缓存的工单? This post在标准的Windows非容器世界中指示了相同的问题,但是不同之处在于仍对该用户正确验证了票证,在这种情况下,我的票证似乎根本没有使用。
*从长远来看,目的不是将密钥表放在我的Docker Image中。我只是出于在我的开发箱上进行测试的目的。