• C
    ext4: support idmapped mounts · 14f3db55
    Christian Brauner 提交于
    Enable idmapped mounts for ext4. All dedicated helpers we need for this
    exist. So this basically just means we're passing down the
    user_namespace argument from the VFS methods to the relevant helpers.
    
    Let's create simple example where we idmap an ext4 filesystem:
    
     root@f2-vm:~# truncate -s 5G ext4.img
    
     root@f2-vm:~# mkfs.ext4 ./ext4.img
     mke2fs 1.45.5 (07-Jan-2020)
     Discarding device blocks: done
     Creating filesystem with 1310720 4k blocks and 327680 inodes
     Filesystem UUID: 3fd91794-c6ca-4b0f-9964-289a000919cf
     Superblock backups stored on blocks:
             32768, 98304, 163840, 229376, 294912, 819200, 884736
    
     Allocating group tables: done
     Writing inode tables: done
     Creating journal (16384 blocks): done
     Writing superblocks and filesystem accounting information: done
    
     root@f2-vm:~# losetup -f --show ./ext4.img
     /dev/loop0
    
     root@f2-vm:~# mount /dev/loop0 /mnt
    
     root@f2-vm:~# ls -al /mnt/
     total 24
     drwxr-xr-x  3 root root  4096 Oct 28 13:34 .
     drwxr-xr-x 30 root root  4096 Oct 28 13:22 ..
     drwx------  2 root root 16384 Oct 28 13:34 lost+found
    
     # Let's create an idmapped mount at /idmapped1 where we map uid and gid
     # 0 to uid and gid 1000
     root@f2-vm:/# ./mount-idmapped --map-mount b:0:1000:1 /mnt/ /idmapped1/
    
     root@f2-vm:/# ls -al /idmapped1/
     total 24
     drwxr-xr-x  3 ubuntu ubuntu  4096 Oct 28 13:34 .
     drwxr-xr-x 30 root   root    4096 Oct 28 13:22 ..
     drwx------  2 ubuntu ubuntu 16384 Oct 28 13:34 lost+found
    
     # Let's create an idmapped mount at /idmapped2 where we map uid and gid
     # 0 to uid and gid 2000
     root@f2-vm:/# ./mount-idmapped --map-mount b:0:2000:1 /mnt/ /idmapped2/
    
     root@f2-vm:/# ls -al /idmapped2/
     total 24
     drwxr-xr-x  3 2000 2000  4096 Oct 28 13:34 .
     drwxr-xr-x 31 root root  4096 Oct 28 13:39 ..
     drwx------  2 2000 2000 16384 Oct 28 13:34 lost+found
    
    Let's create another example where we idmap the rootfs filesystem
    without a mapping for uid 0 and gid 0:
    
     # Create an idmapped mount of for a full POSIX range of rootfs under
     # /mnt but without a mapping for uid 0 to reduce attack surface
    
     root@f2-vm:/# ./mount-idmapped --map-mount b:1:1:65536 / /mnt/
    
     # Since we don't have a mapping for uid and gid 0 all files owned by
     # uid and gid 0 should show up as uid and gid 65534:
     root@f2-vm:/# ls -al /mnt/
     total 664
     drwxr-xr-x 31 nobody nogroup   4096 Oct 28 13:39 .
     drwxr-xr-x 31 root   root      4096 Oct 28 13:39 ..
     lrwxrwxrwx  1 nobody nogroup      7 Aug 25 07:44 bin -> usr/bin
     drwxr-xr-x  4 nobody nogroup   4096 Oct 28 13:17 boot
     drwxr-xr-x  2 nobody nogroup   4096 Aug 25 07:48 dev
     drwxr-xr-x 81 nobody nogroup   4096 Oct 28 04:00 etc
     drwxr-xr-x  4 nobody nogroup   4096 Oct 28 04:00 home
     lrwxrwxrwx  1 nobody nogroup      7 Aug 25 07:44 lib -> usr/lib
     lrwxrwxrwx  1 nobody nogroup      9 Aug 25 07:44 lib32 -> usr/lib32
     lrwxrwxrwx  1 nobody nogroup      9 Aug 25 07:44 lib64 -> usr/lib64
     lrwxrwxrwx  1 nobody nogroup     10 Aug 25 07:44 libx32 -> usr/libx32
     drwx------  2 nobody nogroup  16384 Aug 25 07:47 lost+found
     drwxr-xr-x  2 nobody nogroup   4096 Aug 25 07:44 media
     drwxr-xr-x 31 nobody nogroup   4096 Oct 28 13:39 mnt
     drwxr-xr-x  2 nobody nogroup   4096 Aug 25 07:44 opt
     drwxr-xr-x  2 nobody nogroup   4096 Apr 15  2020 proc
     drwx--x--x  6 nobody nogroup   4096 Oct 28 13:34 root
     drwxr-xr-x  2 nobody nogroup   4096 Aug 25 07:46 run
     lrwxrwxrwx  1 nobody nogroup      8 Aug 25 07:44 sbin -> usr/sbin
     drwxr-xr-x  2 nobody nogroup   4096 Aug 25 07:44 srv
     drwxr-xr-x  2 nobody nogroup   4096 Apr 15  2020 sys
     drwxrwxrwt 10 nobody nogroup   4096 Oct 28 13:19 tmp
     drwxr-xr-x 14 nobody nogroup   4096 Oct 20 13:00 usr
     drwxr-xr-x 12 nobody nogroup   4096 Aug 25 07:45 var
    
     # Since we do have a mapping for uid and gid 1000 all files owned by
     # uid and gid 1000 should simply show up as uid and gid 1000:
     root@f2-vm:/# ls -al /mnt/home/ubuntu/
     total 40
     drwxr-xr-x 3 ubuntu ubuntu  4096 Oct 28 00:43 .
     drwxr-xr-x 4 nobody nogroup 4096 Oct 28 04:00 ..
     -rw------- 1 ubuntu ubuntu  2936 Oct 28 12:26 .bash_history
     -rw-r--r-- 1 ubuntu ubuntu   220 Feb 25  2020 .bash_logout
     -rw-r--r-- 1 ubuntu ubuntu  3771 Feb 25  2020 .bashrc
     -rw-r--r-- 1 ubuntu ubuntu   807 Feb 25  2020 .profile
     -rw-r--r-- 1 ubuntu ubuntu     0 Oct 16 16:11 .sudo_as_admin_successful
     -rw------- 1 ubuntu ubuntu  1144 Oct 28 00:43 .viminfo
    
    Link: https://lore.kernel.org/r/20210121131959.646623-39-christian.brauner@ubuntu.com
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: David Howells <dhowells@redhat.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: linux-ext4@vger.kernel.org
    Cc: linux-fsdevel@vger.kernel.org
    Signed-off-by: NChristian Brauner <christian.brauner@ubuntu.com>
    14f3db55
super.c 190.9 KB