首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CIFS和Kerberos的“挂载错误(126):必需的密钥不可用”

CIFS和Kerberos的“挂载错误(126):必需的密钥不可用”
EN

Stack Overflow用户
提问于 2015-09-17 13:30:06
回答 2查看 32.6K关注 0票数 13

我的应用程序需要使用CIFS和Kerberos安全地挂载Isilon共享。我的mount尝试返回:Required key not available

挂载-t cifs //filerver.example.com/client123 123/files/mnt/client123 123/files -o username=acoder,password=XXXXXX,sec=krb5

响应:

代码语言:javascript
运行
复制
mount error(126): Required key not available
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

以下是来自/var/log/messages的相应条目

代码语言:javascript
运行
复制
Sep 16 16:33:49 clientbox kernel: CIFS VFS: Send error in SessSetup = -126
Sep 16 16:33:49 clientbox kernel: CIFS VFS: cifs_mount failed w/return code = -126

背景与Config

我使用以下方法添加了一个keytab:

代码语言:javascript
运行
复制
/usr/bin/ktutil
addent -password -p acoder@EXAMPLE.COM -k 1 -e rc4-hmac
addent -password -p acoder@EXAMPLE.COM -k 1 -e aes256-cts
wkt /etc/krb5.keytab

使用klist -kte检查:

代码语言:javascript
运行
复制
[acoder@clientbox]# klist -kte
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp         Principal
---- ----------------- --------------------------------------------------------
   1 09/16/15 16:24:32 acoder@EXAMPLE.COM (arcfour-hmac) 
   1 09/16/15 16:25:46 acoder@EXAMPLE.COM (aes256-cts-hmac-sha1-96) 

这是request-key.conf

代码语言:javascript
运行
复制
#OP TYPE    DESCRIPTION CALLOUT INFO    PROGRAM ARG1 ARG2 ARG3 ...
#====== ======= =============== =============== ===============================
create  user        debug:*     negate      /bin/keyctl negate %k 30 %S
create  user        debug:loop:*    *       |/bin/cat
create  user        debug:*     *       /usr/share/keyutils/request-key-debug.sh %k %d %c %S
negate  *       *       *       /bin/keyctl negate %k 30 %S
create  cifs.spnego     *       *       /usr/sbin/cifs.upcall %k
create  dns_resolver    *       *       /usr/sbin/cifs.upcall %k

票证缓存:

代码语言:javascript
运行
复制
# klist | grep "Ticket cache:"
Ticket cache: FILE:/tmp/krb5cc_0

什么会导致“必需的密钥不可用”错误?

编辑:我在CIFS中启用了调试,并试图再次挂载共享。这是输出:

代码语言:javascript
运行
复制
fs/cifs/cifsfs.c: Devname: //fileserver.example.com/client123/files flags: 0 
fs/cifs/connect.c: prefix path /files
fs/cifs/connect.c: Username: acoder
fs/cifs/connect.c: file mode: 0x1ed  dir mode: 0x1ed
fs/cifs/connect.c: CIFS VFS: in cifs_mount as Xid: 8 with uid: 0
fs/cifs/connect.c: UNC: \\fileserver.example.com/client123/files ip: 1.2.3.4
fs/cifs/connect.c: Socket created
fs/cifs/connect.c: sndbuf 19800 rcvbuf 87380 rcvtimeo 0x1b58
fs/cifs/connect.c: CIFS VFS: in cifs_get_smb_ses as Xid: 9 with uid: 0
fs/cifs/connect.c: Demultiplex PID: 22937
fs/cifs/connect.c: Existing smb sess not found
fs/cifs/cifssmb.c: secFlags 0x9
fs/cifs/cifssmb.c: Kerberos only mechanism, enable extended security
fs/cifs/transport.c: For smb_command 114
fs/cifs/transport.c: Sending smb: smb_len=78
fs/cifs/connect.c: RFC1002 header 0xbc
fs/cifs/transport.c: cifs_sync_mid_result: cmd=114 mid=1 state=4
fs/cifs/cifssmb.c: Dialect: 2
fs/cifs/asn1.c: OID len = 7 oid = 0x1 0x2 0x348 0x1bb92
fs/cifs/asn1.c: OID len = 6 oid = 0x1 0x3 0x5 0x1
fs/cifs/asn1.c: OID len = 7 oid = 0x1 0x2 0x348 0xbb92
fs/cifs/asn1.c: OID len = 10 oid = 0x1 0x3 0x6 0x1
fs/cifs/asn1.c: Need to call asn1_octets_decode() function for not_defined_in_RFC4178@please_ignore
fs/cifs/cifssmb.c: negprot rc 0
fs/cifs/connect.c: Security Mode: 0x3 Capabilities: 0x8000e2fc TimeAdjust: 0
fs/cifs/sess.c: sess setup type 4
fs/cifs/cifs_spnego.c: key description = ver=0x2;host=fileserver.example.com;ip4=1.2.3.4;sec=krb5;uid=0x0;creduid=0x0;user=acoder;pid=0xXXXXX
fs/cifs/sess.c: ssetup freeing small buf ffff8804359b02701
CIFS VFS: Send error in SessSetup = -126
fs/cifs/connect.c: CIFS VFS: leaving cifs_get_smb_ses (xid = 9) rc = -126
fs/cifs/connect.c: CIFS VFS: leaving cifs_mount (xid = 8) rc = -126
CIFS VFS: cifs_mount failed w/return code = -126
EN

回答 2

Stack Overflow用户

发布于 2016-08-20 00:49:05

"Required key not available"意味着cifs.upcall --由内核响应挂载请求运行--无法为CIFS服务器获得Kerberos票证,并由此生成对服务器进行身份验证所需的密钥(它将进入客户端线程的内核密钥环)。cifs.upcall登录到daemon.debug;首先检查这些消息。通常是/var/log/daemon,但您可能需要调整syslog配置以包括调试级别的消息。在我的系统中,这些看起来是这样的:

代码语言:javascript
运行
复制
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] key description: cifs.spnego;0;0;3f000000;ver=0x2;host=server.example.com;ip4=10.12.0.6;sec=krb5;uid=0x0;creduid=0x2cec;user=res;pid=0x1997
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] ver=2
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] host=server.example.com
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] ip=10.12.0.6
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] sec=1
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] uid=0
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] creduid=11500
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] user=res
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] pid=6551
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] find_krb5_cc: considering /tmp/krb5cc_5601
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] find_krb5_cc: /tmp/krb5cc_5601 is owned by 5601, not 11500
Aug 19 20:00:26 client.example.com cifs.upcall: [daemon.debug] find_krb5_cc: considering /tmp/krb5cc_5702
...

通常,您会使用这样的挂载命令:

代码语言:javascript
运行
复制
$ sudo mount -t cifs -o user=acoder,cruid=acoder,sec=krb5 ...

cruid参数告诉cifs.upcall这个挂载是代表哪个帐户进行的。它将首先查找这个帐户(/tmp/krb5cc_*)拥有的Kerberos凭据缓存(“ccache”),以查看该帐户是否已登录并具有当前凭据(例如,如果它是一个人并且他们已经执行了kinit);您可以在上面的日志中看到这一点,在上面的日志中,它正在“考虑”各种ccache。如果失败,它将尝试使用键签进行调整。早期版本只使用系统默认键签,这意味着客户端主体的键必须放在那里(通常是/etc/krb5.keytab)。以后的版本有一个-K标记,您可以使用它来部署每个用户的键签,显然在多用户系统上更好。请注意,您不需要挂载命令中的密码;keytab提供了该信息。

要检查的另一件事是,客户机上的Kerberos配置允许获得服务器的CIFS票证,从而完全成功。例如:

代码语言:javascript
运行
复制
$ kinit acoder@EXAMPLE.COM
... type your password
$ klist
... see your TGT
$ kvno cifs/fileserver.example.com@EXAMPLE.COM
$ klist
... see CIFS ticket

无论如何,有许多变量;从cifs.upcall调试日志开始,然后我们从那里开始。

(请注意,第一个答案既混乱又错误;您应该忽略它。不需要将客户端主机连接到领域,并且它的主机主体在这里是不相关的。)

票数 19
EN

Stack Overflow用户

发布于 2016-08-18 16:32:52

假设您已经发布了您的krb5.keytab的全部内容,它似乎错过了主机的关键。为了代表用户获得成功的身份验证,您的服务器需要一个用户和一个服务票证。最简单的方法是通过sssd/samba将服务器连接到域(这将填充您的keytab,然后将用户添加到相同的keytab中。

无论如何,有许多方法可以做到这一点,但您必须确保您的keytab (或keytab)有两个键,这样它就可以同时获得两张票。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32631589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档