Whamcloud - gitweb
7803cd6c3900e417050b4f1a4893cd2108e7d79a
[fs/lustre-release.git] / lustre / ptlrpc / gss / gss_keyring.c
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2012, 2014, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  *
31  * lustre/ptlrpc/gss/gss_keyring.c
32  *
33  * Author: Eric Mei <ericm@clusterfs.com>
34  */
35
36 #define DEBUG_SUBSYSTEM S_SEC
37 #include <linux/init.h>
38 #include <linux/module.h>
39 #include <linux/slab.h>
40 #include <linux/dcache.h>
41 #include <linux/fs.h>
42 #include <linux/crypto.h>
43 #include <linux/key.h>
44 #include <linux/keyctl.h>
45 #include <linux/key-type.h>
46 #include <linux/mutex.h>
47 #include <asm/atomic.h>
48
49 #include <libcfs/linux/linux-list.h>
50 #include <obd.h>
51 #include <obd_class.h>
52 #include <obd_support.h>
53 #include <uapi/linux/lustre/lustre_idl.h>
54 #include <lustre_sec.h>
55 #include <lustre_net.h>
56 #include <lustre_import.h>
57
58 #include "gss_err.h"
59 #include "gss_internal.h"
60 #include "gss_api.h"
61
62 #ifdef HAVE_GET_REQUEST_KEY_AUTH
63 #include <keys/request_key_auth-type.h>
64 #endif
65
66 static struct ptlrpc_sec_policy gss_policy_keyring;
67 static struct ptlrpc_ctx_ops gss_keyring_ctxops;
68 static struct key_type gss_key_type;
69
70 static int sec_install_rctx_kr(struct ptlrpc_sec *sec,
71                                struct ptlrpc_svc_ctx *svc_ctx);
72 static void request_key_unlink(struct key *key);
73
74 /*
75  * the timeout is only for the case that upcall child process die abnormally.
76  * in any other cases it should finally update kernel key.
77  *
78  * FIXME we'd better to incorporate the client & server side upcall timeouts
79  * into the framework of Adaptive Timeouts, but we need to figure out how to
80  * make sure that kernel knows the upcall processes is in-progress or died
81  * unexpectedly.
82  */
83 #define KEYRING_UPCALL_TIMEOUT  (obd_timeout + obd_timeout)
84
85 /* Check caller's namespace in gss_keyring upcall */
86 unsigned int gss_check_upcall_ns = 1;
87
88 /****************************************
89  * internal helpers                     *
90  ****************************************/
91
92 static inline void keyring_upcall_lock(struct gss_sec_keyring *gsec_kr)
93 {
94 #ifdef HAVE_KEYRING_UPCALL_SERIALIZED
95         mutex_lock(&gsec_kr->gsk_uc_lock);
96 #endif
97 }
98
99 static inline void keyring_upcall_unlock(struct gss_sec_keyring *gsec_kr)
100 {
101 #ifdef HAVE_KEYRING_UPCALL_SERIALIZED
102         mutex_unlock(&gsec_kr->gsk_uc_lock);
103 #endif
104 }
105
106 static inline void key_revoke_locked(struct key *key)
107 {
108         set_bit(KEY_FLAG_REVOKED, &key->flags);
109 }
110
111 static void ctx_upcall_timeout_kr(cfs_timer_cb_arg_t data)
112 {
113         struct gss_cli_ctx_keyring *gctx_kr = cfs_from_timer(gctx_kr,
114                                                              data, gck_timer);
115         struct ptlrpc_cli_ctx *ctx = &(gctx_kr->gck_base.gc_base);
116         struct obd_import *imp = ctx->cc_sec->ps_import;
117         struct key *key = gctx_kr->gck_key;
118
119         if (key)
120                 CDEBUG(D_SEC,
121                        "%s: GSS context (%p) negotiation timeout, revoking key (%p)\n",
122                        imp->imp_obd->obd_name, ctx, key);
123         else
124                 CDEBUG(D_SEC,
125                        "%s: GSS context (%p) negotiation timeout, ignoring already unlinked key\n",
126                        imp->imp_obd->obd_name, ctx);
127
128         cli_ctx_expire(ctx);
129         if (key)
130                 key_revoke_locked(key);
131 }
132
133 static void ctx_start_timer_kr(struct ptlrpc_cli_ctx *ctx, time64_t timeout)
134 {
135         struct gss_cli_ctx_keyring *gctx_kr = ctx2gctx_keyring(ctx);
136         struct timer_list *timer = &gctx_kr->gck_timer;
137
138         LASSERT(timer);
139
140         CDEBUG(D_SEC, "ctx %p: start timer %llds\n", ctx, timeout);
141
142         cfs_timer_setup(timer, ctx_upcall_timeout_kr,
143                         (unsigned long)gctx_kr, 0);
144         timer->expires = cfs_time_seconds(timeout) + jiffies;
145         add_timer(timer);
146 }
147
148 /*
149  * caller should make sure no race with other threads
150  */
151 static
152 void ctx_clear_timer_kr(struct ptlrpc_cli_ctx *ctx)
153 {
154         struct gss_cli_ctx_keyring *gctx_kr = ctx2gctx_keyring(ctx);
155         struct timer_list          *timer = &gctx_kr->gck_timer;
156
157         CDEBUG(D_SEC, "ctx %p, key %p\n", ctx, gctx_kr->gck_key);
158
159         timer_delete_sync(timer);
160 }
161
162 static
163 struct ptlrpc_cli_ctx *ctx_create_kr(struct ptlrpc_sec *sec,
164                                      struct vfs_cred *vcred)
165 {
166         struct ptlrpc_cli_ctx      *ctx;
167         struct gss_cli_ctx_keyring *gctx_kr;
168
169         OBD_ALLOC_PTR(gctx_kr);
170         if (gctx_kr == NULL)
171                 return NULL;
172
173         cfs_timer_setup(&gctx_kr->gck_timer, NULL, 0, 0);
174
175         ctx = &gctx_kr->gck_base.gc_base;
176
177         if (gss_cli_ctx_init_common(sec, ctx, &gss_keyring_ctxops, vcred)) {
178                 OBD_FREE_PTR(gctx_kr);
179                 return NULL;
180         }
181
182         ctx->cc_expire = ktime_get_real_seconds() + KEYRING_UPCALL_TIMEOUT;
183         clear_bit(PTLRPC_CTX_NEW_BIT, &ctx->cc_flags);
184         atomic_inc(&ctx->cc_refcount); /* for the caller */
185
186         return ctx;
187 }
188
189 static void ctx_destroy_kr(struct ptlrpc_cli_ctx *ctx)
190 {
191         struct ptlrpc_sec               *sec = ctx->cc_sec;
192         struct gss_cli_ctx_keyring      *gctx_kr = ctx2gctx_keyring(ctx);
193
194         CDEBUG(D_SEC, "destroying ctx %p\n", ctx);
195
196         /* at this time the association with key has been broken. */
197         LASSERT(sec);
198         LASSERT(atomic_read(&sec->ps_refcount) > 0);
199         LASSERT(atomic_read(&sec->ps_nctx) > 0);
200         LASSERT(test_bit(PTLRPC_CTX_CACHED_BIT, &ctx->cc_flags) == 0);
201         LASSERT(gctx_kr->gck_key == NULL);
202
203         ctx_clear_timer_kr(ctx);
204
205         if (gss_cli_ctx_fini_common(sec, ctx))
206                 return;
207
208         OBD_FREE_PTR(gctx_kr);
209
210         atomic_dec(&sec->ps_nctx);
211         sptlrpc_sec_put(sec);
212 }
213
214 static void ctx_release_kr(struct ptlrpc_cli_ctx *ctx, int sync)
215 {
216         if (sync) {
217                 ctx_destroy_kr(ctx);
218         } else {
219                 atomic_inc(&ctx->cc_refcount);
220                 sptlrpc_gc_add_ctx(ctx);
221         }
222 }
223
224 static void ctx_put_kr(struct ptlrpc_cli_ctx *ctx, int sync)
225 {
226         LASSERT(atomic_read(&ctx->cc_refcount) > 0);
227
228         if (atomic_dec_and_test(&ctx->cc_refcount))
229                 ctx_release_kr(ctx, sync);
230 }
231
232 /*
233  * key <-> ctx association and rules:
234  * - ctx might not bind with any key
235  * - key/ctx binding is protected by key semaphore (if the key present)
236  * - key and ctx each take a reference of the other
237  * - ctx enlist/unlist is protected by ctx spinlock
238  * - never enlist a ctx after it's been unlisted
239  * - whoever do enlist should also do bind, lock key before enlist:
240  *   - lock key -> lock ctx -> enlist -> unlock ctx -> bind -> unlock key
241  * - whoever do unlist should also do unbind:
242  *   - lock key -> lock ctx -> unlist -> unlock ctx -> unbind -> unlock key
243  *   - lock ctx -> unlist -> unlock ctx -> lock key -> unbind -> unlock key
244  */
245
246 static inline void spin_lock_if(spinlock_t *lock, int condition)
247 {
248         if (condition)
249                 spin_lock(lock);
250 }
251
252 static inline void spin_unlock_if(spinlock_t *lock, int condition)
253 {
254         if (condition)
255                 spin_unlock(lock);
256 }
257
258 static void ctx_enlist_kr(struct ptlrpc_cli_ctx *ctx, int is_root, int locked)
259 {
260         struct ptlrpc_sec       *sec = ctx->cc_sec;
261         struct gss_sec_keyring  *gsec_kr = sec2gsec_keyring(sec);
262
263         LASSERT(!test_bit(PTLRPC_CTX_CACHED_BIT, &ctx->cc_flags));
264         LASSERT(atomic_read(&ctx->cc_refcount) > 0);
265
266         spin_lock_if(&sec->ps_lock, !locked);
267
268         atomic_inc(&ctx->cc_refcount);
269         set_bit(PTLRPC_CTX_CACHED_BIT, &ctx->cc_flags);
270         hlist_add_head(&ctx->cc_cache, &gsec_kr->gsk_clist);
271         if (is_root)
272                 gsec_kr->gsk_root_ctx = ctx;
273
274         spin_unlock_if(&sec->ps_lock, !locked);
275 }
276
277 /*
278  * Note after this get called, caller should not access ctx again because
279  * it might have been freed, unless caller hold at least one refcount of
280  * the ctx.
281  *
282  * return non-zero if we indeed unlist this ctx.
283  */
284 static int ctx_unlist_kr(struct ptlrpc_cli_ctx *ctx, int locked)
285 {
286         struct ptlrpc_sec       *sec = ctx->cc_sec;
287         struct gss_sec_keyring  *gsec_kr = sec2gsec_keyring(sec);
288
289         /* if hashed bit has gone, leave the job to somebody who is doing it */
290         if (test_and_clear_bit(PTLRPC_CTX_CACHED_BIT, &ctx->cc_flags) == 0)
291                 return 0;
292
293         /* drop ref inside spin lock to prevent race with other operations */
294         spin_lock_if(&sec->ps_lock, !locked);
295
296         if (gsec_kr->gsk_root_ctx == ctx)
297                 gsec_kr->gsk_root_ctx = NULL;
298         hlist_del_init(&ctx->cc_cache);
299         atomic_dec(&ctx->cc_refcount);
300
301         spin_unlock_if(&sec->ps_lock, !locked);
302
303         return 1;
304 }
305
306 /*
307  * Get specific payload. Newer kernels support 4 slots.
308  */
309 static void *
310 key_get_payload(struct key *key, unsigned int index)
311 {
312         void *key_ptr = NULL;
313
314 #ifdef HAVE_KEY_PAYLOAD_DATA_ARRAY
315         key_ptr = key->payload.data[index];
316 #else
317         if (!index)
318                 key_ptr = key->payload.data;
319 #endif
320         return key_ptr;
321 }
322
323 /*
324  * Set specific payload. Newer kernels support 4 slots.
325  */
326 static int key_set_payload(struct key *key, unsigned int index,
327                            struct ptlrpc_cli_ctx *ctx)
328 {
329         int rc = -EINVAL;
330
331 #ifdef HAVE_KEY_PAYLOAD_DATA_ARRAY
332         if (index < 4) {
333                 key->payload.data[index] = ctx;
334 #else
335         if (!index) {
336                 key->payload.data = ctx;
337 #endif
338                 rc = 0;
339         }
340         return rc;
341 }
342
343 /*
344  * bind a key with a ctx together.
345  * caller must hold write lock of the key, as well as ref on key & ctx.
346  */
347 static void bind_key_ctx(struct key *key, struct ptlrpc_cli_ctx *ctx)
348 {
349         LASSERT(atomic_read(&ctx->cc_refcount) > 0);
350         LASSERT(ll_read_key_usage(key) > 0);
351         LASSERT(ctx2gctx_keyring(ctx)->gck_key == NULL);
352         LASSERT(!key_get_payload(key, 0));
353
354         /* at this time context may or may not in list. */
355         key_get(key);
356         atomic_inc(&ctx->cc_refcount);
357         ctx2gctx_keyring(ctx)->gck_key = key;
358         LASSERT(!key_set_payload(key, 0, ctx));
359 }
360
361 /*
362  * unbind a key and a ctx.
363  * caller must hold write lock, as well as a ref of the key.
364  */
365 static void unbind_key_ctx(struct key *key, struct ptlrpc_cli_ctx *ctx)
366 {
367         LASSERT(key_get_payload(key, 0) == ctx);
368         LASSERT(test_bit(PTLRPC_CTX_CACHED_BIT, &ctx->cc_flags) == 0);
369
370         /* must revoke the key, or others may treat it as newly created */
371         key_revoke_locked(key);
372         request_key_unlink(key);
373
374         key_set_payload(key, 0, NULL);
375         ctx2gctx_keyring(ctx)->gck_key = NULL;
376
377         /* once ctx get split from key, the timer is meaningless */
378         ctx_clear_timer_kr(ctx);
379
380         ctx_put_kr(ctx, 1);
381         key_put(key);
382 }
383
384 /*
385  * given a ctx, unbind with its coupled key, if any.
386  * unbind could only be called once, so we don't worry the key be released
387  * by someone else.
388  */
389 static void unbind_ctx_kr(struct ptlrpc_cli_ctx *ctx)
390 {
391         struct key      *key = ctx2gctx_keyring(ctx)->gck_key;
392
393         if (key) {
394                 LASSERT(key_get_payload(key, 0) == ctx);
395
396                 key_get(key);
397                 down_write(&key->sem);
398                 unbind_key_ctx(key, ctx);
399                 up_write(&key->sem);
400                 key_put(key);
401         }
402 }
403
404 /*
405  * given a key, unbind with its coupled ctx, if any.
406  * caller must hold write lock, as well as a ref of the key.
407  */
408 static void unbind_key_locked(struct key *key)
409 {
410         struct ptlrpc_cli_ctx *ctx = key_get_payload(key, 0);
411
412         if (ctx)
413                 unbind_key_ctx(key, ctx);
414 }
415
416 /*
417  * unlist a ctx, and unbind from coupled key
418  */
419 static void kill_ctx_kr(struct ptlrpc_cli_ctx *ctx)
420 {
421         if (ctx_unlist_kr(ctx, 0))
422                 unbind_ctx_kr(ctx);
423 }
424
425 /*
426  * given a key, unlist and unbind with the coupled ctx (if any).
427  * caller must hold write lock, as well as a ref of the key.
428  */
429 static void kill_key_locked(struct key *key)
430 {
431         struct ptlrpc_cli_ctx *ctx = key_get_payload(key, 0);
432
433         if (ctx && ctx_unlist_kr(ctx, 0))
434                 unbind_key_locked(key);
435 }
436
437 /*
438  * caller should hold one ref on contexts in freelist.
439  */
440 static void dispose_ctx_list_kr(struct hlist_head *freelist)
441 {
442         struct hlist_node *next;
443         struct ptlrpc_cli_ctx   *ctx;
444         struct gss_cli_ctx      *gctx;
445
446         hlist_for_each_entry_safe(ctx, next, freelist, cc_cache) {
447                 hlist_del_init(&ctx->cc_cache);
448
449                 /* reverse ctx: update current seq to buddy svcctx if exist.
450                  * ideally this should be done at gss_cli_ctx_finalize(), but
451                  * the ctx destroy could be delayed by:
452                  *  1) ctx still has reference;
453                  *  2) ctx destroy is asynchronous;
454                  * and reverse import call inval_all_ctx() require this be done
455                  * _immediately_ otherwise newly created reverse ctx might copy
456                  * the very old sequence number from svcctx. */
457                 gctx = ctx2gctx(ctx);
458                 if (!rawobj_empty(&gctx->gc_svc_handle) &&
459                     sec_is_reverse(gctx->gc_base.cc_sec)) {
460                         gss_svc_upcall_update_sequence(&gctx->gc_svc_handle,
461                                         (__u32) atomic_read(&gctx->gc_seq));
462                 }
463
464                 /* we need to wakeup waiting reqs here. the context might
465                  * be forced released before upcall finished, then the
466                  * late-arrived downcall can't find the ctx even. */
467                 sptlrpc_cli_ctx_wakeup(ctx);
468
469                 unbind_ctx_kr(ctx);
470                 ctx_put_kr(ctx, 0);
471         }
472 }
473
474 /*
475  * lookup a root context directly in a sec, return root ctx with a
476  * reference taken or NULL.
477  */
478 static
479 struct ptlrpc_cli_ctx * sec_lookup_root_ctx_kr(struct ptlrpc_sec *sec)
480 {
481         struct gss_sec_keyring  *gsec_kr = sec2gsec_keyring(sec);
482         struct ptlrpc_cli_ctx   *ctx = NULL;
483         time64_t now = ktime_get_real_seconds();
484
485         spin_lock(&sec->ps_lock);
486
487         ctx = gsec_kr->gsk_root_ctx;
488
489         if (ctx == NULL && unlikely(sec_is_reverse(sec))) {
490                 struct ptlrpc_cli_ctx   *tmp;
491
492                 /* For reverse context, browse list and pick the one with
493                  * shortest expire time and that has not expired yet.
494                  * This one is most likely to have an established peer context
495                  * on client side.
496                  */
497                 hlist_for_each_entry(tmp, &gsec_kr->gsk_clist, cc_cache) {
498                         if (ctx == NULL || ctx->cc_expire == 0 ||
499                             (tmp->cc_expire > now &&
500                              tmp->cc_expire < ctx->cc_expire) ||
501                             (ctx->cc_expire < now &&
502                              tmp->cc_expire > ctx->cc_expire)) {
503                                 ctx = tmp;
504                                 /* promote to be root_ctx */
505                                 gsec_kr->gsk_root_ctx = ctx;
506                         }
507                 }
508         }
509
510         if (ctx) {
511                 LASSERT(atomic_read(&ctx->cc_refcount) > 0);
512                 LASSERT(!hlist_empty(&gsec_kr->gsk_clist));
513                 atomic_inc(&ctx->cc_refcount);
514         }
515
516         spin_unlock(&sec->ps_lock);
517
518         return ctx;
519 }
520
521 #define RVS_CTX_EXPIRE_NICE    (10)
522
523 static
524 void rvs_sec_install_root_ctx_kr(struct ptlrpc_sec *sec,
525                                  struct ptlrpc_cli_ctx *new_ctx,
526                                  struct key *key)
527 {
528         struct gss_sec_keyring *gsec_kr = sec2gsec_keyring(sec);
529         struct ptlrpc_cli_ctx *ctx;
530         time64_t now;
531
532         ENTRY;
533         LASSERT(sec_is_reverse(sec));
534
535         spin_lock(&sec->ps_lock);
536
537         now = ktime_get_real_seconds();
538
539         /* set all existing ctxs short expiry */
540         hlist_for_each_entry(ctx, &gsec_kr->gsk_clist, cc_cache) {
541                 if (ctx->cc_expire > now + RVS_CTX_EXPIRE_NICE) {
542                         ctx->cc_early_expire = 1;
543                         ctx->cc_expire = now + RVS_CTX_EXPIRE_NICE;
544                 }
545         }
546
547         /* if there's root_ctx there, instead obsolete the current
548          * immediately, we leave it continue operating for a little while.
549          * hopefully when the first backward rpc with newest ctx send out,
550          * the client side already have the peer ctx well established. */
551         ctx_enlist_kr(new_ctx, gsec_kr->gsk_root_ctx ? 0 : 1, 1);
552
553         if (key)
554                 bind_key_ctx(key, new_ctx);
555
556         spin_unlock(&sec->ps_lock);
557 }
558
559 static void construct_key_desc(void *buf, int bufsize,
560                                struct ptlrpc_sec *sec, uid_t uid)
561 {
562         snprintf(buf, bufsize, "%d@%x", uid, sec->ps_id);
563         ((char *)buf)[bufsize - 1] = '\0';
564 }
565
566 /****************************************
567  * sec apis                             *
568  ****************************************/
569
570 static
571 struct ptlrpc_sec * gss_sec_create_kr(struct obd_import *imp,
572                                       struct ptlrpc_svc_ctx *svcctx,
573                                       struct sptlrpc_flavor *sf)
574 {
575         struct gss_sec_keyring  *gsec_kr;
576         ENTRY;
577
578         OBD_ALLOC(gsec_kr, sizeof(*gsec_kr));
579         if (gsec_kr == NULL)
580                 RETURN(NULL);
581
582         INIT_HLIST_HEAD(&gsec_kr->gsk_clist);
583         gsec_kr->gsk_root_ctx = NULL;
584         mutex_init(&gsec_kr->gsk_root_uc_lock);
585 #ifdef HAVE_KEYRING_UPCALL_SERIALIZED
586         mutex_init(&gsec_kr->gsk_uc_lock);
587 #endif
588
589         if (gss_sec_create_common(&gsec_kr->gsk_base, &gss_policy_keyring,
590                                   imp, svcctx, sf))
591                 goto err_free;
592
593         if (svcctx != NULL &&
594             sec_install_rctx_kr(&gsec_kr->gsk_base.gs_base, svcctx)) {
595                 gss_sec_destroy_common(&gsec_kr->gsk_base);
596                 goto err_free;
597         }
598
599         RETURN(&gsec_kr->gsk_base.gs_base);
600
601 err_free:
602         OBD_FREE(gsec_kr, sizeof(*gsec_kr));
603         RETURN(NULL);
604 }
605
606 static
607 void gss_sec_destroy_kr(struct ptlrpc_sec *sec)
608 {
609         struct gss_sec          *gsec = sec2gsec(sec);
610         struct gss_sec_keyring  *gsec_kr = sec2gsec_keyring(sec);
611
612         CDEBUG(D_SEC, "destroy %s@%p\n", sec->ps_policy->sp_name, sec);
613
614         LASSERT(atomic_read(&sec->ps_nctx) == 0);
615         LASSERT(hlist_empty(&gsec_kr->gsk_clist));
616         LASSERT(gsec_kr->gsk_root_ctx == NULL);
617
618         gss_sec_destroy_common(gsec);
619
620         OBD_FREE(gsec_kr, sizeof(*gsec_kr));
621 }
622
623 static inline int user_is_root(struct ptlrpc_sec *sec, struct vfs_cred *vcred)
624 {
625         /* except the ROOTONLY flag, treat it as root user only if real uid
626          * is 0, euid/fsuid being 0 are handled as setuid scenarios */
627         if (sec_is_rootonly(sec) || (vcred->vc_uid == 0))
628                 return 1;
629         else
630                 return 0;
631 }
632
633 /*
634  * When lookup_user_key is available use the kernel API rather than directly
635  * accessing the uid_keyring and session_keyring via the current process
636  * credentials.
637  */
638 #ifdef HAVE_LOOKUP_USER_KEY
639
640 #ifdef HAVE_KEY_NEED_UNLINK
641 /* from Linux security/keys/internal.h: */
642 #  ifndef KEY_LOOKUP_PARTIAL
643 #    define KEY_LOOKUP_PARTIAL 0x2
644 #  endif
645 #else
646 #  define KEY_NEED_UNLINK 0
647 #  ifndef KEY_LOOKUP_FOR_UNLINK
648 #    define KEY_LOOKUP_FOR_UNLINK 0x4
649 #  endif
650 #  define KEY_LOOKUP_PARTIAL KEY_LOOKUP_FOR_UNLINK
651 #endif /* HAVE_KEY_NEED_UNLINK */
652
653 static struct key *_user_key(key_serial_t id)
654 {
655         key_ref_t ref;
656
657         might_sleep();
658         ref = lookup_user_key(id, KEY_LOOKUP_PARTIAL, KEY_NEED_UNLINK);
659         if (IS_ERR(ref))
660                 return NULL;
661         return key_ref_to_ptr(ref);
662 }
663
664 static inline struct key *get_user_session_keyring(const struct cred *cred)
665 {
666         return _user_key(KEY_SPEC_USER_SESSION_KEYRING);
667 }
668
669 static inline struct key *get_user_keyring(const struct cred *cred)
670 {
671         return _user_key(KEY_SPEC_USER_KEYRING);
672 }
673 #else
674 static inline struct key *get_user_session_keyring(const struct cred *cred)
675 {
676         return key_get(cred->user->session_keyring);
677 }
678
679 static inline struct key *get_user_keyring(const struct cred *cred)
680 {
681         return key_get(cred->user->uid_keyring);
682 }
683 #endif
684
685 /*
686  * unlink request key from it's ring, which is linked during request_key().
687  * sadly, we have to 'guess' which keyring it's linked to.
688  */
689 static void request_key_unlink(struct key *key)
690 {
691         struct cred *cred = (struct cred *)current_cred(), *new_cred = NULL;
692 #ifdef HAVE_USER_UID_KEYRING
693         struct key *root_uid_keyring = NULL;
694 #endif
695         const struct cred *old_cred = NULL;
696         kuid_t uid = current_uid();
697         struct key *ring = NULL;
698         int res;
699
700         /* unlink key with user's creds if it's a user key */
701         if (!uid_eq(key->uid, current_uid())) {
702                 new_cred = prepare_creds();
703                 if (new_cred == NULL)
704                         goto search;
705
706                 new_cred->uid = key->uid;
707                 new_cred->user->uid = key->uid;
708 #ifdef HAVE_USER_UID_KEYRING
709                 root_uid_keyring = current_cred()->user->uid_keyring;
710                 new_cred->user->uid_keyring = NULL;
711 #endif
712                 old_cred = override_creds(new_cred);
713                 cred = new_cred;
714         }
715
716         /* User keys are linked to the user keyring. So get it now. */
717         if (from_kuid(&init_user_ns, key->uid)) {
718                 /* Getting a key(ring) normally increases its refcount by 1.
719                  * But if we overrode creds above, calling get_user_keyring()
720                  * will add one more ref, because of the user switch.
721                  */
722                 ring = get_user_keyring(cred);
723                 goto do_unlink;
724         }
725
726 search:
727         switch (cred->jit_keyring) {
728         case KEY_REQKEY_DEFL_DEFAULT:
729         case KEY_REQKEY_DEFL_REQUESTOR_KEYRING:
730 #ifdef HAVE_GET_REQUEST_KEY_AUTH
731                 if (cred->request_key_auth) {
732                         struct request_key_auth *rka;
733                         struct key *authkey = cred->request_key_auth;
734
735                         down_read(&authkey->sem);
736                         rka = get_request_key_auth(authkey);
737                         if (!test_bit(KEY_FLAG_REVOKED, &authkey->flags))
738                                 ring = key_get(rka->dest_keyring);
739                         up_read(&authkey->sem);
740                         if (ring)
741                                 break;
742                 }
743 #endif
744                 fallthrough;
745         case KEY_REQKEY_DEFL_THREAD_KEYRING:
746                 ring = key_get(cred->thread_keyring);
747                 if (ring)
748                         break;
749                 fallthrough;
750         case KEY_REQKEY_DEFL_PROCESS_KEYRING:
751                 ring = key_get(cred->process_keyring);
752                 if (ring)
753                         break;
754                 fallthrough;
755         case KEY_REQKEY_DEFL_SESSION_KEYRING:
756                 rcu_read_lock();
757                 ring = key_get(rcu_dereference(cred->session_keyring));
758                 rcu_read_unlock();
759                 if (ring)
760                         break;
761                 fallthrough;
762         case KEY_REQKEY_DEFL_USER_SESSION_KEYRING:
763                 ring = get_user_session_keyring(cred);
764                 break;
765         case KEY_REQKEY_DEFL_USER_KEYRING:
766                 ring = get_user_keyring(cred);
767                 break;
768         case KEY_REQKEY_DEFL_GROUP_KEYRING:
769         default:
770                 LBUG();
771         }
772
773 do_unlink:
774         if (ring) {
775                 res = key_unlink(ring, key);
776                 CDEBUG(D_SEC,
777                        "Unlink key %08x (%p) from keyring %08x: %d\n",
778                        key->serial, key, ring->serial, res);
779                 /* matches key_get()/get_user_keyring() above */
780                 key_put(ring);
781                 /* If this is a user key, it added an extra ref on the user
782                  * keyring at link/instantiate stage. This ref needs to be
783                  * removed now that the key has been unlinked.
784                  */
785                 if (from_kuid(&init_user_ns, key->uid))
786                         key_put(ring);
787         } else {
788                 CDEBUG(D_SEC,
789                        "Missing keyring, key %08x (%p) could not be unlinked, ignored\n",
790                        key->serial, key);
791         }
792
793         if (old_cred) {
794                 revert_creds(old_cred);
795                 put_cred(new_cred);
796                 current_cred()->user->uid = uid;
797 #ifdef HAVE_USER_UID_KEYRING
798                 /* We are switching creds back, so need to drop ref on keyring
799                  * for kernel implementation based on user keyring pinned from
800                  * the user_struct struct.
801                  */
802                 key_put(ring);
803                 if (root_uid_keyring)
804                         current_cred()->user->uid_keyring = root_uid_keyring;
805 #endif
806         }
807 }
808
809 static
810 struct ptlrpc_cli_ctx * gss_sec_lookup_ctx_kr(struct ptlrpc_sec *sec,
811                                               struct vfs_cred *vcred,
812                                               int create, int remove_dead)
813 {
814         struct obd_import *imp = sec->ps_import;
815         struct gss_sec_keyring *gsec_kr = sec2gsec_keyring(sec);
816         struct ptlrpc_cli_ctx *ctx = NULL;
817         unsigned int is_root = 0, create_new = 0;
818         struct key *key;
819         char desc[24];
820         char *coinfo;
821         int coinfo_size;
822         const char *sec_part_flags = "";
823         char svc_flag = '-';
824         pid_t caller_pid;
825         struct lnet_nid primary;
826         ENTRY;
827
828         LASSERT(imp != NULL);
829
830         is_root = user_is_root(sec, vcred);
831
832         /* a little bit optimization for root context */
833         if (is_root) {
834                 ctx = sec_lookup_root_ctx_kr(sec);
835                 /*
836                  * Only lookup directly for REVERSE sec, which should
837                  * always succeed.
838                  */
839                 if (ctx || sec_is_reverse(sec))
840                         RETURN(ctx);
841         }
842
843         LASSERT(create != 0);
844
845         /* for root context, obtain lock and check again, this time hold
846          * the root upcall lock, make sure nobody else populated new root
847          * context after last check.
848          */
849         if (is_root) {
850                 mutex_lock(&gsec_kr->gsk_root_uc_lock);
851
852                 ctx = sec_lookup_root_ctx_kr(sec);
853                 if (ctx)
854                         goto out;
855
856                 /* update reverse handle for root user */
857                 sec2gsec(sec)->gs_rvs_hdl = gss_get_next_ctx_index();
858
859                 switch (sec->ps_part) {
860                 case LUSTRE_SP_MDT:
861                         sec_part_flags = "m";
862                         break;
863                 case LUSTRE_SP_OST:
864                         sec_part_flags = "o";
865                         break;
866                 case LUSTRE_SP_MGC:
867                         sec_part_flags = "rmo";
868                         break;
869                 case LUSTRE_SP_CLI:
870                         sec_part_flags = "r";
871                         break;
872                 case LUSTRE_SP_MGS:
873                 default:
874                         LBUG();
875                 }
876
877                 switch (SPTLRPC_FLVR_SVC(sec->ps_flvr.sf_rpc)) {
878                 case SPTLRPC_SVC_NULL:
879                         svc_flag = 'n';
880                         break;
881                 case SPTLRPC_SVC_AUTH:
882                         svc_flag = 'a';
883                         break;
884                 case SPTLRPC_SVC_INTG:
885                         svc_flag = 'i';
886                         break;
887                 case SPTLRPC_SVC_PRIV:
888                         svc_flag = 'p';
889                         break;
890                 default:
891                         LBUG();
892                 }
893         }
894
895         /* in case of setuid, key will be constructed as owner of fsuid/fsgid,
896          * but we do authentication based on real uid/gid. the key permission
897          * bits will be exactly as POS_ALL, so only processes who subscribed
898          * this key could have the access, although the quota might be counted
899          * on others (fsuid/fsgid).
900          *
901          * keyring will use fsuid/fsgid as upcall parameters, so we have to
902          * encode real uid/gid into callout info.
903          */
904
905         /* But first we need to make sure the obd type is supported */
906         if (strcmp(imp->imp_obd->obd_type->typ_name, LUSTRE_MDC_NAME) &&
907             strcmp(imp->imp_obd->obd_type->typ_name, LUSTRE_OSC_NAME) &&
908             strcmp(imp->imp_obd->obd_type->typ_name, LUSTRE_MGC_NAME) &&
909             strcmp(imp->imp_obd->obd_type->typ_name, LUSTRE_LWP_NAME) &&
910             strcmp(imp->imp_obd->obd_type->typ_name, LUSTRE_OSP_NAME)) {
911                 CERROR("obd %s is not a supported device\n",
912                        imp->imp_obd->obd_name);
913                 GOTO(out, ctx = NULL);
914         }
915
916         construct_key_desc(desc, sizeof(desc), sec, vcred->vc_uid);
917
918         /* callout info format:
919          * secid:mech:uid:gid:sec_flags:svc_flag:svc_type:peer_nid:target_uuid:
920          * self_nid:pid
921          */
922         coinfo_size = sizeof(struct obd_uuid) + MAX_OBD_NAME + 64;
923         OBD_ALLOC(coinfo, coinfo_size);
924         if (coinfo == NULL)
925                 goto out;
926
927         /* Last callout parameter is pid of process whose namespace will be used
928          * for credentials' retrieval.
929          */
930         if (gss_check_upcall_ns) {
931                 /* For user's credentials (in which case sec_part_flags is
932                  * empty), use current PID instead of import's reference
933                  * PID to get reference namespace.
934                  */
935                 if (sec_part_flags[0] == '\0')
936                         caller_pid = current->pid;
937                 else
938                         caller_pid = imp->imp_sec_refpid;
939         } else {
940                 /* Do not switch namespace in gss keyring upcall. */
941                 caller_pid = 0;
942         }
943         primary = imp->imp_connection->c_self;
944         LNetPrimaryNID(&primary);
945
946         /* FIXME !! Needs to support larger NIDs */
947         snprintf(coinfo, coinfo_size, "%d:%s:%u:%u:%s:%c:%d:%#llx:%s:%#llx:%d",
948                  sec->ps_id, sec2gsec(sec)->gs_mech->gm_name,
949                  vcred->vc_uid, vcred->vc_gid,
950                  sec_part_flags, svc_flag, import_to_gss_svc(imp),
951                  lnet_nid_to_nid4(&imp->imp_connection->c_peer.nid),
952                  imp->imp_obd->obd_name,
953                  lnet_nid_to_nid4(&primary),
954                  caller_pid);
955
956         CDEBUG(D_SEC, "requesting key for %s\n", desc);
957
958         keyring_upcall_lock(gsec_kr);
959         key = request_key(&gss_key_type, desc, coinfo);
960         keyring_upcall_unlock(gsec_kr);
961
962         OBD_FREE(coinfo, coinfo_size);
963
964         if (IS_ERR(key)) {
965                 CERROR("failed request key: %ld\n", PTR_ERR(key));
966                 goto out;
967         }
968         CDEBUG(D_SEC, "obtained key %08x for %s\n", key->serial, desc);
969
970         /* We want user keys to be linked to the user keyring (see call to
971          * keyctl_instantiate() from prepare_and_instantiate() in userspace).
972          * But internally request_key() tends to also link the key to the
973          * session keyring. So do our best to avoid that by trying to unlink
974          * the key from the session keyring right now. It will spare us pain
975          * when we need to remove the key later on.
976          */
977         if (!is_root && current_cred()->session_keyring) {
978                 key_get(current_cred()->session_keyring);
979                 (void)key_unlink(current_cred()->session_keyring, key);
980                 key_put(current_cred()->session_keyring);
981         }
982         /* once payload.data was pointed to a ctx, it never changes until
983          * we de-associate them; but parallel request_key() may return
984          * a key with payload.data == NULL at the same time. so we still
985          * need wirtelock of key->sem to serialize them.
986          */
987         down_write(&key->sem);
988
989         ctx = key_get_payload(key, 0);
990         if (likely(ctx)) {
991                 LASSERT(atomic_read(&ctx->cc_refcount) >= 1);
992                 LASSERT(ctx2gctx_keyring(ctx)->gck_key == key);
993                 LASSERT(ll_read_key_usage(key) >= 2);
994
995                 /* simply take a ref and return. it's upper layer's
996                  * responsibility to detect & replace dead ctx.
997                  */
998                 atomic_inc(&ctx->cc_refcount);
999         } else {
1000                 /* pre initialization with a cli_ctx. this can't be done in
1001                  * key_instantiate() because we'v no enough information
1002                  * there.
1003                  */
1004                 ctx = ctx_create_kr(sec, vcred);
1005                 if (ctx != NULL) {
1006                         ctx_enlist_kr(ctx, is_root, 0);
1007                         bind_key_ctx(key, ctx);
1008
1009                         ctx_start_timer_kr(ctx, KEYRING_UPCALL_TIMEOUT);
1010
1011                         CDEBUG(D_SEC, "installed key %p <-> ctx %p (sec %p)\n",
1012                                key, ctx, sec);
1013                 } else {
1014                         /* we'd prefer to call key_revoke(), but we more like
1015                          * to revoke it within this key->sem locked period.
1016                          */
1017                         CDEBUG(D_SEC, "revoking key %08x (%p)\n",
1018                                key->serial, key);
1019                         key_revoke_locked(key);
1020                 }
1021
1022                 create_new = 1;
1023         }
1024
1025         up_write(&key->sem);
1026
1027         if (is_root && create_new)
1028                 request_key_unlink(key);
1029
1030         key_put(key);
1031 out:
1032         if (is_root)
1033                 mutex_unlock(&gsec_kr->gsk_root_uc_lock);
1034         RETURN(ctx);
1035 }
1036
1037 static
1038 void gss_sec_release_ctx_kr(struct ptlrpc_sec *sec,
1039                             struct ptlrpc_cli_ctx *ctx,
1040                             int sync)
1041 {
1042         LASSERT(atomic_read(&sec->ps_refcount) > 0);
1043         LASSERT(atomic_read(&ctx->cc_refcount) == 0);
1044         ctx_release_kr(ctx, sync);
1045 }
1046
1047 /*
1048  * flush context of normal user, we must resort to keyring itself to find out
1049  * contexts which belong to me.
1050  *
1051  * Note here we suppose only to flush _my_ context, the "uid" will
1052  * be ignored in the search.
1053  */
1054 static
1055 void flush_user_ctx_cache_kr(struct ptlrpc_sec *sec,
1056                              uid_t uid,
1057                              int grace, int force)
1058 {
1059         struct key              *key;
1060         char                     desc[24];
1061
1062         /* nothing to do for reverse or rootonly sec */
1063         if (sec_is_reverse(sec) || sec_is_rootonly(sec))
1064                 return;
1065
1066         construct_key_desc(desc, sizeof(desc), sec, uid);
1067
1068         /* there should be only one valid key, but we put it in the
1069          * loop in case of any weird cases */
1070         for (;;) {
1071                 key = request_key(&gss_key_type, desc, NULL);
1072                 if (IS_ERR(key)) {
1073                         CDEBUG(D_SEC, "No more key found for current user\n");
1074                         break;
1075                 }
1076
1077                 down_write(&key->sem);
1078
1079                 kill_key_locked(key);
1080
1081                 /* kill_key_locked() should usually revoke the key, but we
1082                  * revoke it again to make sure, e.g. some case the key may
1083                  * not well coupled with a context. */
1084                 key_revoke_locked(key);
1085
1086                 up_write(&key->sem);
1087                 key_put(key);
1088         }
1089 }
1090
1091 /*
1092  * flush context of root or all, we iterate through the list.
1093  */
1094 static
1095 void flush_spec_ctx_cache_kr(struct ptlrpc_sec *sec, uid_t uid, int grace,
1096                              int force)
1097 {
1098         struct gss_sec_keyring  *gsec_kr;
1099         struct hlist_head        freelist = HLIST_HEAD_INIT;
1100         struct hlist_node *next;
1101         struct ptlrpc_cli_ctx   *ctx;
1102         ENTRY;
1103
1104         gsec_kr = sec2gsec_keyring(sec);
1105
1106         spin_lock(&sec->ps_lock);
1107         hlist_for_each_entry_safe(ctx, next, &gsec_kr->gsk_clist,
1108                                   cc_cache) {
1109                 LASSERT(atomic_read(&ctx->cc_refcount) > 0);
1110
1111                 if (uid != -1 && uid != ctx->cc_vcred.vc_uid)
1112                         continue;
1113
1114                 /* at this moment there's at least 2 base reference:
1115                  * key association and in-list. */
1116                 if (atomic_read(&ctx->cc_refcount) > 2) {
1117                         if (!force)
1118                                 continue;
1119                         CWARN("flush busy ctx %p(%u->%s, extra ref %d)\n",
1120                               ctx, ctx->cc_vcred.vc_uid,
1121                               sec2target_str(ctx->cc_sec),
1122                               atomic_read(&ctx->cc_refcount) - 2);
1123                 }
1124
1125                 set_bit(PTLRPC_CTX_DEAD_BIT, &ctx->cc_flags);
1126                 if (!grace)
1127                         clear_bit(PTLRPC_CTX_UPTODATE_BIT, &ctx->cc_flags);
1128
1129                 atomic_inc(&ctx->cc_refcount);
1130
1131                 if (ctx_unlist_kr(ctx, 1)) {
1132                         hlist_add_head(&ctx->cc_cache, &freelist);
1133                 } else {
1134                         LASSERT(atomic_read(&ctx->cc_refcount) >= 2);
1135                         atomic_dec(&ctx->cc_refcount);
1136                 }
1137         }
1138         spin_unlock(&sec->ps_lock);
1139
1140         dispose_ctx_list_kr(&freelist);
1141         EXIT;
1142 }
1143
1144 static
1145 int gss_sec_flush_ctx_cache_kr(struct ptlrpc_sec *sec,
1146                                uid_t uid, int grace, int force)
1147 {
1148         ENTRY;
1149
1150         CDEBUG(D_SEC, "sec %p(%d, nctx %d), uid %d, grace %d, force %d\n",
1151                sec, atomic_read(&sec->ps_refcount),
1152                atomic_read(&sec->ps_nctx),
1153                uid, grace, force);
1154
1155         if (uid != -1 && uid != 0)
1156                 flush_user_ctx_cache_kr(sec, uid, grace, force);
1157         else
1158                 flush_spec_ctx_cache_kr(sec, uid, grace, force);
1159
1160         RETURN(0);
1161 }
1162
1163 static
1164 void gss_sec_gc_ctx_kr(struct ptlrpc_sec *sec)
1165 {
1166         struct gss_sec_keyring  *gsec_kr = sec2gsec_keyring(sec);
1167         struct hlist_head       freelist = HLIST_HEAD_INIT;
1168         struct hlist_node *next;
1169         struct ptlrpc_cli_ctx   *ctx;
1170         ENTRY;
1171
1172         CDEBUG(D_SEC, "running gc\n");
1173
1174         spin_lock(&sec->ps_lock);
1175         hlist_for_each_entry_safe(ctx, next, &gsec_kr->gsk_clist,
1176                                   cc_cache) {
1177                 LASSERT(atomic_read(&ctx->cc_refcount) > 0);
1178
1179                 atomic_inc(&ctx->cc_refcount);
1180
1181                 if (cli_ctx_check_death(ctx) && ctx_unlist_kr(ctx, 1)) {
1182                         hlist_add_head(&ctx->cc_cache, &freelist);
1183                         CWARN("unhashed ctx %p\n", ctx);
1184                 } else {
1185                         LASSERT(atomic_read(&ctx->cc_refcount) >= 2);
1186                         atomic_dec(&ctx->cc_refcount);
1187                 }
1188         }
1189         spin_unlock(&sec->ps_lock);
1190
1191         dispose_ctx_list_kr(&freelist);
1192         EXIT;
1193 }
1194
1195 static
1196 int gss_sec_display_kr(struct ptlrpc_sec *sec, struct seq_file *seq)
1197 {
1198         struct gss_sec_keyring *gsec_kr = sec2gsec_keyring(sec);
1199         struct hlist_node *next;
1200         struct ptlrpc_cli_ctx *ctx;
1201         struct gss_cli_ctx *gctx;
1202         struct ptlrpc_connection *conn;
1203         time64_t now = ktime_get_real_seconds();
1204
1205         ENTRY;
1206         spin_lock(&sec->ps_lock);
1207         hlist_for_each_entry_safe(ctx, next, &gsec_kr->gsk_clist,
1208                                   cc_cache) {
1209                 struct key *key;
1210                 char flags_str[40];
1211                 char mech[40];
1212
1213                 gctx = ctx2gctx(ctx);
1214                 key = ctx2gctx_keyring(ctx)->gck_key;
1215                 if (sec_is_reverse(sec) &&
1216                     ctx->cc_sec && ctx->cc_sec->ps_import &&
1217                     ctx->cc_sec->ps_import->imp_connection)
1218                         conn = ctx->cc_sec->ps_import->imp_connection;
1219                 else
1220                         conn = NULL;
1221
1222                 gss_cli_ctx_flags2str(ctx->cc_flags,
1223                                       flags_str, sizeof(flags_str));
1224
1225                 if (gctx->gc_mechctx)
1226                         lgss_display(gctx->gc_mechctx, mech, sizeof(mech));
1227                 else
1228                         snprintf(mech, sizeof(mech), "N/A");
1229                 mech[sizeof(mech) - 1] = '\0';
1230
1231                 seq_printf(seq,
1232                            "- { %s%s%suid: %u, ctxref: %d, expire: %lld, delta: %lld, flags: [%s], seq: %d, win: %u, key: %08x, keyref: %d, hdl: \"%#llx:%#llx\", mech: \"%s\" }\n",
1233                            conn ? "peer_nid: " : "",
1234                            conn ? libcfs_nidstr(&conn->c_peer.nid) : "",
1235                            conn ? ", " : "",
1236                            ctx->cc_vcred.vc_uid, atomic_read(&ctx->cc_refcount),
1237                            ctx->cc_expire,
1238                            ctx->cc_expire ?  ctx->cc_expire - now : 0,
1239                            flags_str, atomic_read(&gctx->gc_seq),
1240                            gctx->gc_win, key ? key->serial : 0,
1241                            key ? ll_read_key_usage(key) : 0,
1242                            gss_handle_to_u64(&gctx->gc_handle),
1243                            gss_handle_to_u64(&gctx->gc_svc_handle),
1244                            mech);
1245         }
1246         spin_unlock(&sec->ps_lock);
1247
1248         RETURN(0);
1249 }
1250
1251 /****************************************
1252  * cli_ctx apis                         *
1253  ****************************************/
1254
1255 static
1256 int gss_cli_ctx_refresh_kr(struct ptlrpc_cli_ctx *ctx)
1257 {
1258         /* upcall is already on the way */
1259         struct gss_cli_ctx *gctx = ctx ? ctx2gctx(ctx) : NULL;
1260
1261         /* record latest sequence number in buddy svcctx */
1262         if (gctx && !rawobj_empty(&gctx->gc_svc_handle) &&
1263             sec_is_reverse(gctx->gc_base.cc_sec)) {
1264                 return gss_svc_upcall_update_sequence(&gctx->gc_svc_handle,
1265                                              (__u32)atomic_read(&gctx->gc_seq));
1266         }
1267         return 0;
1268 }
1269
1270 static
1271 int gss_cli_ctx_validate_kr(struct ptlrpc_cli_ctx *ctx)
1272 {
1273         LASSERT(atomic_read(&ctx->cc_refcount) > 0);
1274         LASSERT(ctx->cc_sec);
1275
1276         if (cli_ctx_check_death(ctx)) {
1277                 kill_ctx_kr(ctx);
1278                 return 1;
1279         }
1280
1281         if (cli_ctx_is_ready(ctx))
1282                 return 0;
1283         return 1;
1284 }
1285
1286 static
1287 void gss_cli_ctx_die_kr(struct ptlrpc_cli_ctx *ctx, int grace)
1288 {
1289         LASSERT(atomic_read(&ctx->cc_refcount) > 0);
1290         LASSERT(ctx->cc_sec);
1291
1292         cli_ctx_expire(ctx);
1293         kill_ctx_kr(ctx);
1294 }
1295
1296 /****************************************
1297  * (reverse) service                    *
1298  ****************************************/
1299
1300 /*
1301  * reverse context could have nothing to do with keyrings. here we still keep
1302  * the version which bind to a key, for future reference.
1303  */
1304 #define HAVE_REVERSE_CTX_NOKEY
1305
1306 #ifdef HAVE_REVERSE_CTX_NOKEY
1307
1308 static
1309 int sec_install_rctx_kr(struct ptlrpc_sec *sec,
1310                         struct ptlrpc_svc_ctx *svc_ctx)
1311 {
1312         struct ptlrpc_cli_ctx *cli_ctx;
1313         struct vfs_cred vcred = { .vc_uid = 0 };
1314         int rc;
1315
1316         LASSERT(sec);
1317         LASSERT(svc_ctx);
1318
1319         cli_ctx = ctx_create_kr(sec, &vcred);
1320         if (cli_ctx == NULL)
1321                 return -ENOMEM;
1322
1323         rc = gss_copy_rvc_cli_ctx(cli_ctx, svc_ctx);
1324         if (rc) {
1325                 CERROR("failed copy reverse cli ctx: %d\n", rc);
1326
1327                 ctx_put_kr(cli_ctx, 1);
1328                 return rc;
1329         }
1330
1331         rvs_sec_install_root_ctx_kr(sec, cli_ctx, NULL);
1332
1333         ctx_put_kr(cli_ctx, 1);
1334
1335         return 0;
1336 }
1337
1338 #else /* ! HAVE_REVERSE_CTX_NOKEY */
1339
1340 static
1341 int sec_install_rctx_kr(struct ptlrpc_sec *sec,
1342                         struct ptlrpc_svc_ctx *svc_ctx)
1343 {
1344         struct ptlrpc_cli_ctx *cli_ctx = NULL;
1345         struct key *key;
1346         struct vfs_cred vcred = { .vc_uid = 0 };
1347         char desc[64];
1348         int rc;
1349
1350         LASSERT(sec);
1351         LASSERT(svc_ctx);
1352         CWARN("called\n");
1353
1354         construct_key_desc(desc, sizeof(desc), sec, 0);
1355
1356         key = key_alloc(&gss_key_type, desc, 0, 0,
1357                         KEY_POS_ALL | KEY_USR_ALL, 1);
1358         if (IS_ERR(key)) {
1359                 CERROR("failed to alloc key: %ld\n", PTR_ERR(key));
1360                 return PTR_ERR(key);
1361         }
1362
1363         rc = key_instantiate_and_link(key, NULL, 0, NULL, NULL);
1364         if (rc) {
1365                 CERROR("failed to instantiate key: %d\n", rc);
1366                 goto err_revoke;
1367         }
1368
1369         down_write(&key->sem);
1370
1371         LASSERT(!key_get_payload(key, 0));
1372
1373         cli_ctx = ctx_create_kr(sec, &vcred);
1374         if (cli_ctx == NULL) {
1375                 rc = -ENOMEM;
1376                 goto err_up;
1377         }
1378
1379         rc = gss_copy_rvc_cli_ctx(cli_ctx, svc_ctx);
1380         if (rc) {
1381                 CERROR("failed copy reverse cli ctx: %d\n", rc);
1382                 goto err_put;
1383         }
1384
1385         rvs_sec_install_root_ctx_kr(sec, cli_ctx, key);
1386
1387         ctx_put_kr(cli_ctx, 1);
1388         up_write(&key->sem);
1389
1390         rc = 0;
1391         CWARN("ok!\n");
1392 out:
1393         key_put(key);
1394         return rc;
1395
1396 err_put:
1397         ctx_put_kr(cli_ctx, 1);
1398 err_up:
1399         up_write(&key->sem);
1400 err_revoke:
1401         key_revoke(key);
1402         goto out;
1403 }
1404
1405 #endif /* HAVE_REVERSE_CTX_NOKEY */
1406
1407 /****************************************
1408  * service apis                         *
1409  ****************************************/
1410
1411 static
1412 int gss_svc_accept_kr(struct ptlrpc_request *req)
1413 {
1414         return gss_svc_accept(&gss_policy_keyring, req);
1415 }
1416
1417 static
1418 int gss_svc_install_rctx_kr(struct obd_import *imp,
1419                             struct ptlrpc_svc_ctx *svc_ctx)
1420 {
1421         struct ptlrpc_sec *sec;
1422         int                rc;
1423
1424         sec = sptlrpc_import_sec_ref(imp);
1425         LASSERT(sec);
1426
1427         rc = sec_install_rctx_kr(sec, svc_ctx);
1428         sptlrpc_sec_put(sec);
1429
1430         return rc;
1431 }
1432
1433 /****************************************
1434  * key apis                             *
1435  ****************************************/
1436
1437 static
1438 #ifdef HAVE_KEY_TYPE_INSTANTIATE_2ARGS
1439 int gss_kt_instantiate(struct key *key, struct key_preparsed_payload *prep)
1440 {
1441         const void *data = prep->data;
1442         size_t datalen = prep->datalen;
1443 #else
1444 int gss_kt_instantiate(struct key *key, const void *data, size_t datalen)
1445 {
1446 #endif
1447         struct key *keyring;
1448         int uid, rc;
1449
1450         ENTRY;
1451
1452         CDEBUG(D_SEC, "instantiating key %08x (%p)\n", key->serial, key);
1453
1454         if (data != NULL || datalen != 0) {
1455                 CERROR("invalid: data %p, len %lu\n", data, (long)datalen);
1456                 RETURN(-EINVAL);
1457         }
1458
1459         if (key_get_payload(key, 0)) {
1460                 CERROR("key already have payload\n");
1461                 RETURN(-EINVAL);
1462         }
1463
1464         /* link the key to session keyring, so following context negotiation
1465          * rpc fired from user space could find this key. This will be unlinked
1466          * automatically when upcall processes die.
1467          *
1468          * we can't do this through keyctl from userspace, because the upcall
1469          * might be neither possessor nor owner of the key (setuid).
1470          *
1471          * the session keyring is created upon upcall, and don't change all
1472          * the way until upcall finished, so rcu lock is not needed here.
1473          *
1474          * But for end users, link to the user keyring. This simplifies key
1475          * management, makes them shared accross all user sessions, and avoids
1476          * unfortunate key leak if lfs flushctx is not called at user logout.
1477          */
1478         uid = from_kuid(&init_user_ns, current_uid());
1479         if (uid == 0)
1480                 keyring = current_cred()->session_keyring;
1481         else
1482                 keyring = get_user_keyring(current_cred());
1483
1484         lockdep_off();
1485         rc = key_link(keyring, key);
1486         lockdep_on();
1487         if (unlikely(rc)) {
1488                 CERROR("failed to link key %08x to keyring %08x: %d\n",
1489                        key->serial, keyring->serial, rc);
1490                 RETURN(rc);
1491         }
1492
1493         CDEBUG(D_SEC,
1494               "key %08x (%p) linked to keyring %08x and instantiated, ctx %p\n",
1495                key->serial, key, keyring->serial, key_get_payload(key, 0));
1496         RETURN(0);
1497 }
1498
1499 /*
1500  * called with key semaphore write locked. it means we can operate
1501  * on the context without fear of loosing refcount.
1502  */
1503 static
1504 #ifdef HAVE_KEY_TYPE_INSTANTIATE_2ARGS
1505 int gss_kt_update(struct key *key, struct key_preparsed_payload *prep)
1506 {
1507         const void *data = prep->data;
1508         __u32 datalen32 = (__u32) prep->datalen;
1509 #else
1510 int gss_kt_update(struct key *key, const void *data, size_t datalen)
1511 {
1512         __u32 datalen32 = (__u32) datalen;
1513 #endif
1514         struct ptlrpc_cli_ctx *ctx = key_get_payload(key, 0);
1515         struct gss_cli_ctx *gctx;
1516         rawobj_t tmpobj = RAWOBJ_EMPTY;
1517         int rc;
1518         ENTRY;
1519
1520         CDEBUG(D_SEC, "updating key %08x (%p)\n", key->serial, key);
1521
1522         if (data == NULL || datalen32 == 0) {
1523                 CWARN("invalid: data %p, len %lu\n", data, (long)datalen32);
1524                 RETURN(-EINVAL);
1525         }
1526
1527         /* if upcall finished negotiation too fast (mostly likely because
1528          * of local error happened) and call kt_update(), the ctx
1529          * might be still NULL. but the key will finally be associate
1530          * with a context, or be revoked. if key status is fine, return
1531          * -EAGAIN to allow userspace sleep a while and call again. */
1532         if (ctx == NULL) {
1533                 CDEBUG(D_SEC, "update too soon: key %08x (%p) flags %lx\n",
1534                        key->serial, key, key->flags);
1535
1536                 rc = key_validate(key);
1537                 if (rc == 0)
1538                         RETURN(-EAGAIN);
1539                 else
1540                         RETURN(rc);
1541         }
1542
1543         LASSERT(atomic_read(&ctx->cc_refcount) > 0);
1544         LASSERT(ctx->cc_sec);
1545
1546         ctx_clear_timer_kr(ctx);
1547
1548         /* don't proceed if already refreshed */
1549         if (cli_ctx_is_refreshed(ctx)) {
1550                 CWARN("ctx already done refresh\n");
1551                 RETURN(0);
1552         }
1553
1554         sptlrpc_cli_ctx_get(ctx);
1555         gctx = ctx2gctx(ctx);
1556
1557         rc = buffer_extract_bytes(&data, &datalen32, &gctx->gc_win,
1558                                   sizeof(gctx->gc_win));
1559         if (rc) {
1560                 CERROR("failed extract seq_win\n");
1561                 goto out;
1562         }
1563
1564         if (gctx->gc_win == 0) {
1565                 __u32   nego_rpc_err, nego_gss_err;
1566
1567                 rc = buffer_extract_bytes(&data, &datalen32, &nego_rpc_err,
1568                                           sizeof(nego_rpc_err));
1569                 if (rc) {
1570                         CERROR("cannot extract RPC: rc = %d\n", rc);
1571                         goto out;
1572                 }
1573
1574                 rc = buffer_extract_bytes(&data, &datalen32, &nego_gss_err,
1575                                           sizeof(nego_gss_err));
1576                 if (rc) {
1577                         CERROR("failed to extract gss rc = %d\n", rc);
1578                         goto out;
1579                 }
1580
1581                 CERROR("negotiation: rpc err %d, gss err %x\n",
1582                        nego_rpc_err, nego_gss_err);
1583
1584                 rc = nego_rpc_err ? nego_rpc_err : -EACCES;
1585         } else {
1586                 rc = rawobj_extract_local_alloc(&gctx->gc_handle,
1587                                                 (__u32 **) &data, &datalen32);
1588                 if (rc) {
1589                         CERROR("failed extract handle\n");
1590                         goto out;
1591                 }
1592
1593                 rc = rawobj_extract_local(&tmpobj,
1594                                           (__u32 **) &data, &datalen32);
1595                 if (rc) {
1596                         CERROR("failed extract mech\n");
1597                         goto out;
1598                 }
1599
1600                 rc = lgss_import_sec_context(&tmpobj,
1601                                              sec2gsec(ctx->cc_sec)->gs_mech,
1602                                              &gctx->gc_mechctx);
1603                 if (rc != GSS_S_COMPLETE)
1604                         CERROR("failed import context\n");
1605                 else
1606                         rc = 0;
1607         }
1608 out:
1609         CDEBUG(D_SEC, "update of key %08x (%p): %d\n", key->serial, key, rc);
1610         /* we don't care what current status of this ctx, even someone else
1611          * is operating on the ctx at the same time. we just add up our own
1612          * opinions here. */
1613         if (rc == 0) {
1614                 gss_cli_ctx_uptodate(gctx);
1615         } else {
1616                 /* this will also revoke the key. has to be done before
1617                  * wakeup waiters otherwise they can find the stale key */
1618                 kill_key_locked(key);
1619
1620                 cli_ctx_expire(ctx);
1621
1622                 if (rc != -ERESTART)
1623                         set_bit(PTLRPC_CTX_ERROR_BIT, &ctx->cc_flags);
1624         }
1625
1626         /* let user space think it's a success */
1627         sptlrpc_cli_ctx_put(ctx, 1);
1628         RETURN(0);
1629 }
1630
1631 #ifndef HAVE_KEY_MATCH_DATA
1632 static int
1633 gss_kt_match(const struct key *key, const void *desc)
1634 {
1635         return strcmp(key->description, (const char *) desc) == 0 &&
1636                 !test_bit(KEY_FLAG_REVOKED, &key->flags);
1637 }
1638 #else /* ! HAVE_KEY_MATCH_DATA */
1639 static bool
1640 gss_kt_match(const struct key *key, const struct key_match_data *match_data)
1641 {
1642         const char *desc = match_data->raw_data;
1643
1644         return strcmp(key->description, desc) == 0 &&
1645                 !test_bit(KEY_FLAG_REVOKED, &key->flags);
1646 }
1647
1648 /*
1649  * Preparse the match criterion.
1650  */
1651 static int gss_kt_match_preparse(struct key_match_data *match_data)
1652 {
1653         match_data->lookup_type = KEYRING_SEARCH_LOOKUP_DIRECT;
1654         match_data->cmp = gss_kt_match;
1655         return 0;
1656 }
1657 #endif /* HAVE_KEY_MATCH_DATA */
1658
1659 static
1660 void gss_kt_destroy(struct key *key)
1661 {
1662         ENTRY;
1663         LASSERT(!key_get_payload(key, 0));
1664         CDEBUG(D_SEC, "destroy key %08x %p\n", key->serial, key);
1665         EXIT;
1666 }
1667
1668 static
1669 void gss_kt_describe(const struct key *key, struct seq_file *s)
1670 {
1671         if (key->description == NULL)
1672                 seq_puts(s, "[null]");
1673         else
1674                 seq_puts(s, key->description);
1675 }
1676
1677 static struct key_type gss_key_type =
1678 {
1679         .name           = "lgssc",
1680         .def_datalen    = 0,
1681         .instantiate    = gss_kt_instantiate,
1682         .update         = gss_kt_update,
1683 #ifdef HAVE_KEY_MATCH_DATA
1684         .match_preparse = gss_kt_match_preparse,
1685 #else
1686         .match          = gss_kt_match,
1687 #endif
1688         .destroy        = gss_kt_destroy,
1689         .describe       = gss_kt_describe,
1690 };
1691
1692 /****************************************
1693  * lustre gss keyring policy            *
1694  ****************************************/
1695
1696 static struct ptlrpc_ctx_ops gss_keyring_ctxops = {
1697         .match                  = gss_cli_ctx_match,
1698         .refresh                = gss_cli_ctx_refresh_kr,
1699         .validate               = gss_cli_ctx_validate_kr,
1700         .die                    = gss_cli_ctx_die_kr,
1701         .sign                   = gss_cli_ctx_sign,
1702         .verify                 = gss_cli_ctx_verify,
1703         .seal                   = gss_cli_ctx_seal,
1704         .unseal                 = gss_cli_ctx_unseal,
1705         .wrap_bulk              = gss_cli_ctx_wrap_bulk,
1706         .unwrap_bulk            = gss_cli_ctx_unwrap_bulk,
1707 };
1708
1709 static struct ptlrpc_sec_cops gss_sec_keyring_cops = {
1710         .create_sec             = gss_sec_create_kr,
1711         .destroy_sec            = gss_sec_destroy_kr,
1712         .kill_sec               = gss_sec_kill,
1713         .lookup_ctx             = gss_sec_lookup_ctx_kr,
1714         .release_ctx            = gss_sec_release_ctx_kr,
1715         .flush_ctx_cache        = gss_sec_flush_ctx_cache_kr,
1716         .gc_ctx                 = gss_sec_gc_ctx_kr,
1717         .install_rctx           = gss_sec_install_rctx,
1718         .alloc_reqbuf           = gss_alloc_reqbuf,
1719         .free_reqbuf            = gss_free_reqbuf,
1720         .alloc_repbuf           = gss_alloc_repbuf,
1721         .free_repbuf            = gss_free_repbuf,
1722         .enlarge_reqbuf         = gss_enlarge_reqbuf,
1723         .display                = gss_sec_display_kr,
1724 };
1725
1726 static struct ptlrpc_sec_sops gss_sec_keyring_sops = {
1727         .accept                 = gss_svc_accept_kr,
1728         .invalidate_ctx         = gss_svc_invalidate_ctx,
1729         .alloc_rs               = gss_svc_alloc_rs,
1730         .authorize              = gss_svc_authorize,
1731         .free_rs                = gss_svc_free_rs,
1732         .free_ctx               = gss_svc_free_ctx,
1733         .prep_bulk              = gss_svc_prep_bulk,
1734         .unwrap_bulk            = gss_svc_unwrap_bulk,
1735         .wrap_bulk              = gss_svc_wrap_bulk,
1736         .install_rctx           = gss_svc_install_rctx_kr,
1737 };
1738
1739 static struct ptlrpc_sec_policy gss_policy_keyring = {
1740         .sp_owner               = THIS_MODULE,
1741         .sp_name                = "gss.keyring",
1742         .sp_policy              = SPTLRPC_POLICY_GSS,
1743         .sp_cops                = &gss_sec_keyring_cops,
1744         .sp_sops                = &gss_sec_keyring_sops,
1745 };
1746
1747
1748 int __init gss_init_keyring(void)
1749 {
1750         int rc;
1751
1752         rc = register_key_type(&gss_key_type);
1753         if (rc) {
1754                 CERROR("failed to register keyring type: %d\n", rc);
1755                 return rc;
1756         }
1757
1758         rc = sptlrpc_register_policy(&gss_policy_keyring);
1759         if (rc) {
1760                 unregister_key_type(&gss_key_type);
1761                 return rc;
1762         }
1763
1764         return 0;
1765 }
1766
1767 void __exit gss_exit_keyring(void)
1768 {
1769         unregister_key_type(&gss_key_type);
1770         sptlrpc_unregister_policy(&gss_policy_keyring);
1771 }