242 karma · joined November 10, 2014
Well, not if I spend my free time on open source projects :-D
* Only use technology that already exists for at least 10 years and is widely used: bash python3 C and Linux
* No external libraries, only the python standard library and the C standard library
* No monolithic design, it's a mix of about 30 standalone utilities that I can rewrite gradually if for example ever python3 becomes out of fashion.
* Keep the line count low
* Rely on proven abstractions like processes, files, pipes, the environment list, etc
But aren't we all a little beta anyway?
> > Can you elaborate what exactly the issues is? I use this quite often.
> It's a container escape. The chroot shouldn't be able to access the hosts tmp files. Creating a tmpfs and using that is a safer method. If you can read and write the hosts tmpfs, then you can impact the behaviour of the host.
ok ja, I know, I am also mounting /home. There are no guarantees that there is any security gain by using this and security is not the goal of this software.
> For /dev it's just because it has to be a proper bind, and I haven't looked deeply enough to check that happens.
I am using `mount("/dev", "./rootfs/dev", "none", MS_MGC_VAL|MS_BIND|MS_REC, NULL)` so a recursive bind so we also get stuff like "/dev/pts". I am using this regularly and it works perfect for me, let me know if you know of any specific problems with this!
The thing that worries me more is the bchroot.c, but since it does not promise any guarantees on isolation and is not setuid or so there really should'nt be any security issues.
> I have some concerns about binding /tmp and /dev the way you do...
Can you elaborate what exactly the issues is? I use this quite often.
> But a bigger concern is the assumption that /bin/bash will be available. What if it isn't?
Then you'll have to call 'bchroot ./rootfs /bin/ash' instead of just 'bchroot ./rootfs', just like with the regular chroot.
> It copies _my_ resolv.conf into the chroot blindly, [...]
bchroot mounts the hosts resolv.conf over it anyway. This is just a redunancy for some corner case I have (whole programming environment already inside an namespaced chroot)
I was thinking about using Ubuntu, but in the end took void linux because it's the smallest glibc based distribution I could found. Python wheels don't work on musl based distributions
Thread < Process < Plash < Container < Full virtualization < Dedicated Hardware
Plash is conceptually somewhere between containers as they existed until now and operating system processes. Technically a plash container is just a process. Security wise exactly the same rules that apply for UNIX processes, apply for plash containers. Which is why I say that they are much more secure than the stuff that major container systems have to do to create that extra layer of - buzzword alarm - isolation.
So whatever which term means what, the security concept of plash is really easy to understand: a plash container is just a process. You started plash with your user PinaColada - great, your plash container has PinaColada access rights, if it wants it can delete your PinaColad's home folder, but not system folders.
You want to create and AppArmor for a plash container like you could also do it with other processes? That would work.
You really like bubblewrap? wrap plash with it (not tried, but should work)
Virtually everything you can do with processes, you can do with plash.
For me isolation and sandboxing is not the same. A function of a container is to provide a more well defined environment, usually for other application to run more reliable. That by itself says nothing about security. My claim of "natural interaction with the host operating system" is archived by just having containers being "normal" processes. You can see plash containers with top, kill them with `kill`, or set them a different nice value. They also have automagically environment variables like DISPLAY exported to them, so most graphical interfaces will work (you can e.G. run gimp or firefox). I did not invent any new sandboxing/security-related-isolation mechanisms. Since it's just processes, the usual rules for processes apply, like that you can't kill a process from another user, access rights for the filesystem are enforced and so on.
The nice think about plash is that you don't have to worry about "official" support.
> [...] due to /sys being read-only.
Dammit, no, so yeah, apparently unfortunately for regular docker containers (not privileged ones) you need to disable unsharing in plash (export PLASH_NO_UNSHARE=1). In that case the only requirements are chroot, a rudimentary mount binary and overlay OR unionfs-fuse and root access. So it should even run in BSD/Minix/macOS and stuff like that, BUT the mountpoints will not get cleaned up. For an instance running for a while that would be a problem, for a temporary docker container not.
plash uses along others linux namespaces and chroot. So inside a linux namespace you can actually use the vanilla chroot:
ihucos@macbook:~/plash$ # get an example rootfs
ihucos@macbook:~/plash$ mkdir /tmp/m
ihucos@macbook:~/plash$ plash mount --from ubuntu -- /tmp/m
ihucos@macbook:~/plash$
ihucos@macbook:~/plash$ unshare --map-root --user --mount
root@macbook:~/plash# chroot /tmp/m
root@macbook:/# type apt
apt is /usr/bin/apt
root@macbook:/# exit
> Have you investigated into creating reproducible containers?Interesting topic. I wanted to, but did not come very far. Maybe now that I "finished" plash and have more time haha.
btw: I just tested and you can just run unprivileged plash containers inside a unprivileged plash process! But you need to install unionfs-fuse in the first container. When/If I port plash to C maybe that dependency can be statically linked or something like that, lets see.
> Really cool, I like the documentation on the website - would be nice if the README was actual HTML though.
Thanks, the README is not in markup so it's one little dependency less when I have to migrate out from Github at some point (M$)
EDIT:
> Edit: Why the downvote? Am I misunderstanding something?
It wasn't me, I think they where great questions!
> Does that mean I can build container images within a running container (for example the GitLab-CI) without doing a stunt like docker-in-docker or fakechroot/fakeroot?
Sure, plash's unit tests involve building and they run inside a plash instance at travis CI.
I'll have lunch now and then continue with the reply after.
In my opinion the isolation mechanism of major container software like docker is flawed and thinking about it gives me headaches. One problem is that you need a daemon running as root. It's better if you don't have to leave the user space at all. To be fair plash relies on fuse and newuidmap/newgidmap which are suid, so there is at least a little bit happening with root access rights. But it's comparably very little and there is nothing self-baked running as root.
There are many details that for me are unclear in docker, one out of the of the tip of my head, is that the usage of a overlay mount is disabled by non-root users (also inside user maps) because the kernel does not want to guarantee that a bogus setup can cause a security issue.
> Would you move to Docker/runC?
Never :-) The whole point of this is to not use Docker/runC. One of the core aspects of plash is that containers should just be normal processes. Processes is an interface that existed since decades, for containers I need to learn a new tool just to kill one or list all that are running (use ps/kill in plash)
In my head isolation and containerization are two completely different problems. If you really want "complete" isolation in plash you'd just had to setuid/setgid/setgroups away from the namespaced root user. Then as far as the kernel is concerned you would be a different user and if you are the only process with this uid you are completely isolated. Maybe I'll add an flag for that.
EDIT:
I am not happy with it at all but changed it:
- Security: Traditional per user isolation. Containers run completely unprivileged.
Containerisation and sandboxing are two different things. Sandboxing in major container software is fundamentally broken !111