我就是我,原理不一樣的snap
引言
snap和flatpak都是新一代跨Linux發(fā)行版的軟件包管理技術(shù),上一篇我們簡單介紹了flatpak的原理(傳送門),今天我們接著簡要介紹snap的安全機制。
一、簡介
snap是Canoncial公司提出的新一代linux包管理工具,致力于將所有linux發(fā)行版上的包格式統(tǒng)一,做到“一次打包,到處使用”。目前snap已經(jīng)可以在包括Ubuntu、Fedora、Mint等多個Linux發(fā)行版上使用。首先我們來了解下snap相關(guān)的各種名詞:
snap
新一代跨Linux發(fā)行版的軟件包管理技術(shù),支持各大主流Linux發(fā)行版,通過Linux內(nèi)核安全機制保證用戶數(shù)據(jù)安全,徹底解決包依賴關(guān)系相關(guān)問題,并大大簡化應用軟件的打包工序。snap同時為安裝及管理snap包的命令行工具。
snapd
管理snap軟件包的后臺服務。
kernel snap
使用snap格式打包的內(nèi)核,包含內(nèi)核鏡像及內(nèi)核模塊。
OS snap
使用snap格式重新打包的rootfs,包含了運行和管理snap的基本資源,當你第一次安裝snap時,OS snap 首先被安裝。
snapcraft
將軟件打包成snap格式的打包工具集。
snappy
原指完全基于snap構(gòu)建的系統(tǒng),此名稱已棄用,現(xiàn)統(tǒng)一稱為Ubuntu Core,即Ubuntu的全snap操作系統(tǒng),有別于傳統(tǒng)基于deb包的classic Ubuntu。
二、安全策略
snap應用以沙箱的方式運行。系統(tǒng)通過一些機制限制應用訪問資源的權(quán)限來實現(xiàn)其安全特性,比如通過對內(nèi)核安全機制AppArmor,Seccomp等的配置實現(xiàn)的沙箱和snap文件系統(tǒng)等。開發(fā)者不必過多了解系統(tǒng)安全機制的細節(jié)。下面簡要說明snap使用的部分安全策略。
Sandbox
Linux Sandbox 是根據(jù)內(nèi)核中支持的一些安全機制實現(xiàn)的進程訪問控制方式。通常通過為進程分配隨機uid,將進程置于chroot環(huán)境和為進程uid配置Capability等方式將進程置于嚴格受限的一種狀態(tài)下。snap應用使用這種方式運行在系統(tǒng)為其分配的沙箱環(huán)境中。
security policy ID
每一個snap應用程序命令都有唯一的security policy ID,系統(tǒng)將此ID與命令綁定,由此可以為同一snap包內(nèi)的不同程序配置不同的安全策略。作為系統(tǒng)識別命令的標示,當程序安裝和運行時,系統(tǒng)會根據(jù)其Security Policy ID為其分配資源。在沙箱中運行的snap應用之間的通信控制也通過此ID來進行配置。
snap應用的security policy ID的命名規(guī)則為snap.name.command
例如,hello程序的security policy ID即為snap.hello.hello
snap文件系統(tǒng)
snap文件系統(tǒng)被劃分為具有只讀和讀寫兩種不同權(quán)限的區(qū)域,每個snap應用有其獨有的受限文件目錄,如下圖所示:

可以通過如下方式查看某應用的文件訪問權(quán)限:
$ snap install hello
hello 2.10 from 'canonical' installed
$ snap run --shell hello.hello
$ env | grep SNAP
SNAP_USER_COMMON=/home/kylin/snap/hello/common
# 單用戶所有版本應用的可寫目錄
SNAP_LIBRARY_PATH=/var/lib/snapd/lib/gl:/var/lib/snapd/void
# 增加到LD_LABRARY_PATH的目錄
SNAP_COMMON=/var/snap/hello/common
# 所有用戶所有版本應用的可寫目錄
SNAP_USER_DATA=/home/kylin/snap/hello/20
# 單用戶指定版本應用的可寫目錄
SNAP_DATA=/var/snap/hello/20
# 所有用戶指定版本應用的可寫目錄
由此可見,一個snap應用具有寫權(quán)限的目錄是極其有限的,并且每個snap應用都有其獨立的可寫目錄。snap文件系統(tǒng)對snap應用相關(guān)目錄的權(quán)限配置說明,這種方式實現(xiàn)了應用與應用,應用與系統(tǒng)之間的隔離。
同時這種方式對snap應用的升級和回滾提供了很好的支持,升級時只需將確定版本的相關(guān)目錄復制到更高版本的對應目錄,而回退只需刪除更高版本的目錄。
AppArmor
AppArmor是一個強制訪問控制系統(tǒng),在內(nèi)核層面對進程可訪問的資源進行控制。 在snap應用程序安裝時,系統(tǒng)會為其中的每一個命令生成其特有的AppArmor配置文件。內(nèi)核對可執(zhí)行程序的Capability限制也可以通過Aparmor來配置。當執(zhí)行應用程序中的命令時,AppArmor機制可保證此命令不會越權(quán)訪問。 作為一種內(nèi)核中的安全機制,在ubuntu classic系統(tǒng)中也同時支持AppArmor提供的機制。但與classic系統(tǒng)不同,snap系統(tǒng)對程序的訪問控制更加嚴格,基本做到“只滿足程序執(zhí)行所需的最小權(quán)限”。
Seccomp
Seccomp是一個內(nèi)核接口訪問過濾器,snap應用程序通過其獨有的過濾器訪問內(nèi)核接口。在snap應用程序啟動之前會自動配置過濾器。Seccomp在snap系統(tǒng)中的作用類似于AppArmor。都是控制應用程序?qū)ο到y(tǒng)資源的訪問。
三、Snap接口調(diào)用
snap應用被嚴格限制在上面介紹的安全策略下,但snap應用之間也需要進行通信,比如硬件驅(qū)動作為一個snap應用肯定要為使用這個硬件的應用提供接口和服務。下面就簡單說明一下snap應用之間的通信機制。
默認安全策略
在沒有特殊配置時,snap應用使用默認的安全策略,其中包含之前提到的snap文件系統(tǒng)中的默認目錄訪問控制以及以下部分策略:
· snap應用安裝目錄的只讀權(quán)限。
· 共享內(nèi)存的讀寫權(quán)限(ie. /dev/shm/snap.SNAP_NAME.*)
· 相同應用的不同進程之間互相發(fā)送signal的權(quán)限
安裝模式
snap通過不同的安裝模式提供不同的資源訪問控制。
1) Devmode
devmode即為開發(fā)模式。使用以下命令將應用安裝在此模式下:
$ snap install hello --devmode
$ snap list
Name Version Rev Developer Notes
core 16-2.26.9 2381 canonical -
hello 2.10 20 canonical devmode
pc 16.04-0.8 9 canonical -
pc-kernel 4.4.0-83.106 68 canonical -
此模式為應用程序提供完全的訪問權(quán)限,但會在日志中記錄程序的越權(quán)行為。
在devmode下,snap應用只能訪問/snap/
2) Classic
此模式將取消所有訪問限制,不會在日志中記錄越權(quán)行為。
在classic模式下,snap應用可以訪問’/’下的文件。
Interfaces
除去默認安全策略為其提供的資源外,snap應用沒有權(quán)限訪問系統(tǒng)其它資源。若snap應用需要使用系統(tǒng)資源或其它應用程序提供的資源,需通過interfaces機制配置接口。interfaces接口分為兩種,slot(服務提供者)和plug(服務使用者)。
snap應用訪問受限資源的示意如下:

注意:操作系統(tǒng)在snap系統(tǒng)中也作為snap應用的形式存在。
如圖所示,通過配置snap應用的plug和slot即可實現(xiàn)snap應用的互相訪問。
查看系統(tǒng)上已經(jīng)存在的plug和slot:
$ snap interfaces
Slot Plug
:account-control -
:alsa -
:autopilot-introspection -
:bluetooth-control -
:browser-support -
:camera -
:classic-support classic
:core-support core:core-support-plug
.........
下面以一個例子說明plug和slot的使用。
name: blue
...
apps:
blue:
command: bin/blue
slots: [bluez]
以上文件可作為一個藍牙設備驅(qū)動程序的snap包打包控制文件。當此應用被安裝時,系統(tǒng)將為其分配security policy ID為snap.blue.blue并包含規(guī)則:當blue啟動時為其創(chuàng)建bluez slot。
要在其它應用中使用這個slot提供的功能,則打包控制文件如下所示:
name: blue-client
...
apps:
blue-client:
command: bin/blue-client
plugs: [bluez]
同理,當此應用被安裝時,系統(tǒng)將為其分配security policy ID為snap.blue-client.blue-client并包含規(guī)則:允許此應用與snap.blue.blue通信。同時,提供slot的安全規(guī)則也會改寫為:snap.blue.blue允許snap.blue-client.blue-client與其進行通信。
下圖說明了snap應用與應用之間在嚴格的分隔限制下的互相通信。

snap系統(tǒng)由snap應用組成,包括系統(tǒng)和內(nèi)核都以snap包的形式出現(xiàn)在系統(tǒng)中。各個snap包之間通過interfaces互相提供服務來完成協(xié)同工作,同時各個應用又不失自身的獨立性。
四、總結(jié)
snap系統(tǒng)提供了強大的安全系統(tǒng)。與傳統(tǒng)linux發(fā)行版相比,snap系統(tǒng)中的應用更加獨立、安全,同時對snap應用權(quán)限的配置也更加簡單。在日益增長的嵌入式和物聯(lián)網(wǎng)需求與日益嚴峻的系統(tǒng)安全形勢下,snap系統(tǒng)表現(xiàn)出了比傳統(tǒng)linux發(fā)行版更突出的優(yōu)勢。
-
優(yōu)麒麟 18.04.4 LTS 版本發(fā)布![2020-02-13]
-
【簡訊】優(yōu)麒麟 17.04 技術(shù)開發(fā)交流會在北京召開![2016-12-16]
-
優(yōu)麒麟社區(qū)助力開源中國【OSC源創(chuàng)會長沙站】[2017-03-28]
-
開發(fā)神器來了??!如何在優(yōu)麒麟上安裝跨平臺應用框架Flutter[2021-12-16]
-
優(yōu)麒麟18.04發(fā)布派對—中國農(nóng)業(yè)大學[2018-05-21]
-
優(yōu)麒麟出品《COSCon'20 — 開源操作系統(tǒng)論壇》在長沙成功舉行![2020-10-24]
-
【麒麟在線講堂】優(yōu)麒麟生物特征認證系統(tǒng)-03驅(qū)動開發(fā)[2021-06-24]
-
優(yōu)麒麟18.04發(fā)布派對—深圳大學[2018-05-22]
-
Ubuntu Kylin13.10技術(shù)沙龍在長沙成功舉行[2013-11-20]
-
"恰開發(fā)者青年,風華正茂"—CSDC開發(fā)者大會成功舉行[2016-06-28]
-
【麒麟在線講堂】優(yōu)麒麟生物特征認證系統(tǒng)-01簡述[2021-06-24]
-
優(yōu)麒麟團隊劉正元淺談“Linux通用塊層之IO合并”[2018-06-06]