私のアプリケーションでは、CIFSとKerberosを使用してIsilon共有を安全にマウントする必要があります。私のmount
試行は次を返します:Required key not available
:
mount -t cifs //fileserver.example.com/client123/files/mnt/client123/files -o username = acoder、password = XXXXXX、sec = krb5
応答:
mount error(126): Required key not available
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
/var/log/messages
の対応するエントリは次のとおりです
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
背景と構成
私はキータブを追加しました:
/usr/bin/ktutil
addent -password -p [email protected] -k 1 -e rc4-hmac
addent -password -p [email protected] -k 1 -e aes256-cts
wkt /etc/krb5.keytab
klist -kte
で確認:
[acoder@clientbox]# klist -kte
Keytab name: FILE:/etc/krb5.keytab
KVNO Timestamp Principal
---- ----------------- --------------------------------------------------------
1 09/16/15 16:24:32 [email protected] (arcfour-hmac)
1 09/16/15 16:25:46 [email protected] (aes256-cts-hmac-sha1-96)
request-key.conf
は次のとおりです:
#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
チケットキャッシュ:
# klist | grep "Ticket cache:"
Ticket cache: FILE:/tmp/krb5cc_0
「必要なキーを使用できません」エラーの原因は何ですか?
編集:CIFSでデバッグを有効にし、共有を再度マウントしようとしました。その出力は次のとおりです。
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
"Required key not available"
という意味です cifs.upcall
—マウント要求への応答としてカーネルによって実行されました— CIFSサーバーのKerberosチケットを取得できず、サーバーからの認証に必要なキーを生成できませんでした(クライアントスレッドのカーネルキーリングに入ります) )。 cifs.upcall
ログdaemon.debug
;最初にそれらのメッセージを確認してください。通常は/var/log/daemon
、ただし、デバッグレベルのメッセージを含めるには、syslog構成を調整する必要がある場合があります。私のシステムでは、これらは次のようになります。
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
...
通常、次のようなマウントコマンドを使用します。
$ Sudo mount -t cifs -o user=acoder,cruid=acoder,sec=krb5 ...
cruid
パラメータはcifs.upcall
このマウントが発生しているアカウントに代わって。このアカウントが所有するKerberos資格情報キャッシュ(「ccaches」)を探します(/tmp/krb5cc_*
)最初に、そのアカウントがログインしていて、現在の認証情報があるかどうかを確認します(例:それが個人であり、kinit
を実行したかどうか)。さまざまなccacheを「検討」している上記のログで、これが動作しているのを確認できます。それが失敗した場合、キータブでkinitを試みます。以前のバージョンは、システムのデフォルトのキータブを使用するだけです。つまり、クライアントプリンシパルのキーはそこに移動する必要があります(通常は/etc/krb5.keytab
)。以降のバージョンには-K
フラグ。これは、ユーザーごとのキータブを展開するために使用できます。明らかに、マルチユーザーシステムでより優れています。 mountコマンドではパスワードは必要ないことに注意してください。キータブはその情報を提供します。
チェックする別のことは、クライアントのKerberos構成により、サーバーがまったく成功するためのCIFSチケットを取得できることです。例えば。:
$ kinit [email protected]
... type your password
$ klist
... see your TGT
$ kvno cifs/[email protected]
$ klist
... see CIFS ticket
とにかく、多くの変数があります。 cifs.upcall
ログをデバッグして、そこから始めましょう。
(最初の答えは混乱していて間違っていることに注意してください。無視してください。クライアントホストをレルムに参加させる必要はなく、そのホストプリンシパルはここでは関係ありません。)
krb5.keytab
のコンテンツ全体を投稿したとすると、ホストのキーが不足しているようです。ユーザーの代わりに認証を成功させるには、サーバーにユーザーとサービスチケットの両方が必要です。最も簡単な方法は、sssd/sambaを介してサーバーをドメインに参加させることです(これにより、キータブがで埋められ、ユーザーが同じキータブに追加されます)。
とにかく、それを行うには多くの方法がありますが、両方のチケットを取得できるように、キータブ(または複数のキータブ)に両方のキーがあることを確認する必要があります。