目的
目的很簡單月幌,就是運行一些有風(fēng)險的應(yīng)用程序的時候碍讯,針對該程序把個人文件目錄給屏蔽掉,防止個人文件被讀取和篡改飞醉。
實現(xiàn)方式
用到了unshare
這個命令冲茸,腳本如下:
#!/bin/bash
set -e
MY_USER=$USER
sudo unshare -f -m -p --mount-proc bash -c "\
mount -t tmpfs none /data && \
mount --bind $PWD/sandbox/home /home && \
/usr/bin/docker-init -- su $MY_USER"
原理
unshare
命令用到了Linux的Namespace特性,是 Linux 內(nèi)核用來隔離內(nèi)核資源的方式缅帘,也是Docker的原理之一轴术。可以通過man 1 unshare
查看參數(shù)的含義钦无。
通過-m
參數(shù)逗栽,隔離與其他進程之間的mount操作,防止mount影響到其他進程失暂。
這里把有個人文件的/data目錄mount到tmpfs彼宠,實現(xiàn)屏蔽的效果鳄虱,再通過mount --bind
來屏蔽/home目錄,對/home的操作轉(zhuǎn)移到沙箱的文件夾凭峡。
因為通過-p
和--mount-proc
隔離了PID拙已,所以使用docker-init
作為1號進程,處理其他進程產(chǎn)生的SIGCHLD
信號摧冀,防止僵尸進程的產(chǎn)生等作用倍踪。