Received: by 2002:a05:6358:701b:b0:131:369:b2a3 with SMTP id 27csp2560359rwo; Sun, 23 Jul 2023 19:01:26 -0700 (PDT) X-Google-Smtp-Source: APBJJlEAUk7jUGlcdsF6kiPKw5SlAZjTcw6fFn1/LZkDHQy+zAVXdRIe7HRpvTAVjnZaf7VlxX6E X-Received: by 2002:a17:906:51de:b0:993:d97f:ae06 with SMTP id v30-20020a17090651de00b00993d97fae06mr9330675ejk.13.1690164086047; Sun, 23 Jul 2023 19:01:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690164086; cv=none; d=google.com; s=arc-20160816; b=NH731aUA80LUEP/OnSFnqD+c2IrBnqtB84/UfdyEZdraWkzypH6RW6o+6T4Ad/Ja1L UxLPGNq2MtESGkjBbWwkI+3ojjaIf0OGUFIpMhDWv9Dh77fOmuA4tPTpwutvmcAXe2g5 HYnaqQjsG9/KpJcx4TSZG7c+iPry9KNz7xIWmIHFKf4o9wtqtV857gs9Ke3K8f0KDvtq pMArZd1kH9ab1cMHTRiIWF8PIDodOE6qHpcyY0BC5P9jfUokg+sSaacsDsCnktZVdK9M XwXrqBXWl5D7R+ji8F7X/MpWqX9+ojXm6K66BWoR00iVL+Ok9E8LfWCjoEOmDoE0cAVP +MMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=2WkKtlTfdzdRbT+kDNFRtZnQaI9gazMxS86pPa1uKms=; fh=5rmZikZZbkgvY0yEfsyNBe2meZa+r6d/FeyDloOgrrU=; b=BWod5pYgA+CXU5AkiENmZmFv34N6L0nj9CQ4slEnTUp0nag7XrI6wW67AVIOG5Yp2s 12vtBhDX8TFIa/QGZakouUNsWFC/2wIvPOuQBoWNXnDmLS/WoE64X0BrmijxuTPFvjhy oYxWVPpgLukd4v+CH0NsX9U7Cg4Ap2TozRxDIy7D3xScFdb+WPJYq7fAQEJK4OlNdOlB F+J1Zyswmv/8r2CklDIX9nn6UI1xX9B9hEoLSxmKFWocUQedTZbPCjBbnw9OvFStDdko o7aXLacPbFNx8rqPfD2zRj936/4IeQzLuxjHfAkVOYkpaJ6acNIH3jyM8UjURR/JodSM F7TQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Fu1KBf03; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id se22-20020a170906ce5600b0098dd9f4ed60si5307757ejb.848.2023.07.23.19.01.01; Sun, 23 Jul 2023 19:01:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Fu1KBf03; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229652AbjGXBDM (ORCPT + 99 others); Sun, 23 Jul 2023 21:03:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:42096 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229456AbjGXBDL (ORCPT ); Sun, 23 Jul 2023 21:03:11 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 909C5109 for ; Sun, 23 Jul 2023 18:02:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1690160543; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=2WkKtlTfdzdRbT+kDNFRtZnQaI9gazMxS86pPa1uKms=; b=Fu1KBf03Q9PeUL6lruerhZ5FEnfnmcIXXfg8qeR0ziUqfc3wFCQesqzpK9IP+g+KCyGU0j DYf4/xXzINOE3Cb8pXQX/lNRzxGCNqT9RgVmuwrQjTzULSFCZC5VOQ0pB1ngTySVj4DxmA qBoEztlMMplMptLP8GHNZZeSXhJr2Ks= Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-159-mdWFfuoBPAGQCQXMcGqOXA-1; Sun, 23 Jul 2023 21:02:22 -0400 X-MC-Unique: mdWFfuoBPAGQCQXMcGqOXA-1 Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-6826902bc8dso2707237b3a.1 for ; Sun, 23 Jul 2023 18:02:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690160541; x=1690765341; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=2WkKtlTfdzdRbT+kDNFRtZnQaI9gazMxS86pPa1uKms=; b=PZTwQoQp0oCNge8L+QHgcRfOtuNKtuA7Q6knWW/D03IKtWXQ0mDLIAWY071ns4ouO8 rurP2C7vgajUtRyvRp426v25vGqjMf7aUGJGTyPmOftouYVcZa8cLAxCdmQf5QJl86aQ ewqW1CvCQIA1tuW3x1pl6xZrkZ3PJH1BrqHOzLy7CfQVg69tzB1t1gzSQIIPt+1vhSOO 8TRHw4uBX9Rw0unh8sw+8i6+GHac2soVBrtoQfnOhIajIpGJnt3pTHVhTzfWbiEw6Wmn 1pGfGGLLL7vWF/Ktu8D2/bcyN0CYrne72av6t2EWlejjNzW0lPMZIzZF20L4P8v/j3Dj f1Iw== X-Gm-Message-State: ABy/qLYUNOz/S4JdwYNzS4PnYQ/MR/bnyOlcvGrPFlpMJacHjhrc9JLV l9ddAdG9F4lrECUpHIhUbJRAuKNkin96PpYix3pepDxqS6qKHvAYKrMCCIrRJXZlWuSxgKi+UOW AxxD/9tzbSQytYCCYXjVPKwzw X-Received: by 2002:a05:6a21:3285:b0:125:3445:8af0 with SMTP id yt5-20020a056a21328500b0012534458af0mr10459877pzb.7.1690160541390; Sun, 23 Jul 2023 18:02:21 -0700 (PDT) X-Received: by 2002:a05:6a21:3285:b0:125:3445:8af0 with SMTP id yt5-20020a056a21328500b0012534458af0mr10459863pzb.7.1690160541026; Sun, 23 Jul 2023 18:02:21 -0700 (PDT) Received: from [10.72.112.55] ([43.228.180.230]) by smtp.gmail.com with ESMTPSA id j1-20020aa783c1000000b0063f00898245sm952470pfn.146.2023.07.23.18.02.17 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 23 Jul 2023 18:02:20 -0700 (PDT) Message-ID: Date: Mon, 24 Jul 2023 09:02:15 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Subject: Re: [PATCH v5 00/14] ceph: support idmapped mounts Content-Language: en-US To: Aleksandr Mikhalitsyn Cc: Gregory Farnum , Christian Brauner , stgraber@ubuntu.com, linux-fsdevel@vger.kernel.org, Ilya Dryomov , Jeff Layton , ceph-devel@vger.kernel.org, linux-kernel@vger.kernel.org References: <20230608154256.562906-1-aleksandr.mikhalitsyn@canonical.com> <977d8133-a55f-0667-dc12-aa6fd7d8c3e4@redhat.com> <626175e2-ee91-0f1a-9e5d-e506aea366fa@redhat.com> <64241ff0-9af3-6817-478f-c24a0b9de9b3@redhat.com> <4c4f73d8-8238-6ab8-ae50-d83c1441ac05@redhat.com> <0a42c5d0-0479-e60e-ac84-be3b915c62d9@redhat.com> <8121882a-0823-3a60-e108-0ff7bae5c0c9@redhat.com> <3af4f092-8de7-d217-cd2d-d39dfc625edd@redhat.com> From: Xiubo Li In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 7/21/23 23:43, Aleksandr Mikhalitsyn wrote: > On Thu, Jul 20, 2023 at 8:36 AM Xiubo Li wrote: >> >> On 7/19/23 19:57, Aleksandr Mikhalitsyn wrote: >>> On Tue, Jul 18, 2023 at 4:49 PM Aleksandr Mikhalitsyn >>> wrote: >>>> On Tue, Jul 18, 2023 at 3:45 AM Xiubo Li wrote: >> [...] >>>> No, the idea is to stop mapping a caller_{uid, gid}. And to add a new >>>> fields like >>>> inode_owner_{uid, gid} which will be idmapped (this field will be specific only >>>> for those operations that create a new inode). >>> I've decided to write some summary of different approaches and >>> elaborate tricky places. >>> >>> Current implementation. >>> >>> We have head->caller_{uid,gid} fields mapped in according >>> to the mount's idmapping. But as we don't have information about >>> mount's idmapping in all call stacks (like ->lookup case), we >>> are not able to map it always and they are left untouched in these cases. >>> >>> This tends to an inconsistency between different inode_operations, >>> for example ->lookup (don't have an access to an idmapping) and >>> ->mkdir (have an idmapping as an argument). >>> >>> This inconsistency is absolutely harmless if the user does not >>> use UID/GID-based restrictions. Because in this use case head->caller_{uid,gid} >>> fields used *only* to set inode owner UID/GID during the inode_operations >>> which create inodes. >>> >>> Conclusion 1. head->caller_{uid,gid} fields have two meanings >>> - UID/GID-based permission checks >>> - inode owner information >>> >>> Solution 0. Ignore the issue with UID/GID-based restrictions and idmapped mounts >>> until we are not blamed by users ;-) >>> >>> As far as I can see you are not happy about this way. :-) >>> >>> Solution 1. Let's add mount's idmapping argument to all inode_operations >>> and always map head->caller_{uid,gid} fields. >>> >>> Not a best idea, because: >>> - big modification of VFS layer >>> - ideologically incorrect, for instance ->lookup should not care >>> and know *anything* about mount's idmapping, because ->lookup works >>> not on the mount level (it's not important who and through which mount >>> triggered the ->lookup). Imagine that you've dentry cache filled and call >>> open(...) in this case ->lookup can be uncalled. But if the user was not lucky >>> enough to have cache filled then open(..) will trigger the lookup and >>> then ->lookup results will be dependent on the mount's idmapping. It >>> seems incorrect >>> and unobvious consequence of introducing such a parameter to ->lookup operation. >>> To summarize, ->lookup is about filling dentry cache and dentry cache >>> is superblock-level >>> thing, not mount-level. >>> >>> Solution 2. Add some kind of extra checks to ceph-client and ceph >>> server to detect that >>> mount idmappings used with UID/GID-based restrictions and restrict such mounts. >>> >>> Seems not ideal to me too. Because it's not a fix, it's a limitation >>> and this limitation is >>> not cheap from the implementation perspective (we need heavy changes >>> in ceph server side and >>> client side too). Btw, currently VFS API is also not ready for that, >>> because we can't >>> decide if idmapped mounts are allowed or not in runtime. It's a static >>> thing that should be declared >>> with FS_ALLOW_IDMAP flag in (struct file_system_type)->fs_flags. Not a >>> big deal, but... >>> >>> Solution 3. Add a new UID/GID fields to ceph request structure in >>> addition to head->caller_{uid,gid} >>> to store information about inode owners (only for inode_operations >>> which create inodes). >>> >>> How does it solves the problem? >>> With these new fields we can leave head->caller_{uid,gid} untouched >>> with an idmapped mounts code. >>> It means that UID/GID-based restrictions will continue to work as intended. >>> >>> At the same time, new fields (let say "inode_owner_{uid,gid}") will be >>> mapped in accordance with >>> a mount's idmapping. >>> >>> This solution seems ideal, because it is philosophically correct, it >>> makes cephfs idmapped mounts to work >>> in the same manner and way as idmapped mounts work for any other >>> filesystem like ext4. >> Okay, this approach sounds more reasonable to me. But you need to do >> some extra work to make it to be compatible between {old,new} kernels >> and {old,new} cephs. >> >> So then the caller uid/gid will always be the user uid/gid issuing the >> requests as now. > Dear Xiubo, > > I've posted a PR https://github.com/ceph/ceph/pull/52575 Sure. Will check. Thanks - Xiubo > Kind regards, > Alex > >> Thanks >> >> - Xiubo >> >> >>> But yes, this requires cephfs protocol changes... >>> >>> I personally still believe that the "Solution 0" approach is optimal >>> and we can go with "Solution 3" way >>> as the next iteration. >>> >>> Kind regards, >>> Alex >>> >>>> And also the same for other non-create requests. If >>>>> so this will be incorrect for the cephx perm checks IMO. >>>> Thanks, >>>> Alex >>>> >>>>> Thanks >>>>> >>>>> - Xiubo >>>>> >>>>> >>>>>> This makes a problem with path-based UID/GID restriction mechanism, >>>>>> because it uses head->caller_{uid,gid} fields >>>>>> to check if UID/GID is permitted or not. >>>>>> >>>>>> So, the problem is that we have one field in ceph request for two >>>>>> different needs - to control permissions and to set inode owner. >>>>>> Christian pointed that the most saner way is to modify ceph protocol >>>>>> and add a separate field to store inode owner UID/GID, >>>>>> and only this fields should be idmapped, but head->caller_{uid,gid} >>>>>> will be untouched. >>>>>> >>>>>> With this approach, we will not affect UID/GID-based permission rules >>>>>> with an idmapped mounts at all. >>>>>> >>>>>> Kind regards, >>>>>> Alex >>>>>> >>>>>>> Thanks >>>>>>> >>>>>>> - Xiubo >>>>>>> >>>>>>> >>>>>>>> Kind regards, >>>>>>>> Alex >>>>>>>> >>>>>>>>> Thanks >>>>>>>>> >>>>>>>>> - Xiubo >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> Alex >>>>>>>>>> >>>>>>>>>>> Thanks >>>>>>>>>>> >>>>>>>>>>> - Xiubo >>>>>>>>>>>