我就是我,原理不同的snap

引言

snapflatpak都是新一代跨Linux發行版的軟件包管理技術,這兩種下一代打包方法在本質上擁有相同的目標和特色:即不依賴於第三方系統功能庫的獨立包裝。上一篇咱們簡單介紹了flatpak的原理,今天咱們接着簡要介紹snap的安全機制。linux

 

1、簡介

snapCanoncial公司提出的新一代linux包管理工具,致力於將全部linux發行版上的包格式統一,作到一次打包,處處使用目前snap已經能夠在包括UbuntuFedoraMint等多個Linux發行版上使用。首先咱們來了解下snap相關的各類名詞:shell

snap

新一代跨Linux發行版的軟件包管理技術,支持各大主流Linux發行版,經過Linux內核安全機制保證用戶數據安全,完全解決包依賴關係相關問題,並大大簡化應用軟件的打包工序。snap同時爲安裝及管理snap包的命令行工具。ubuntu

snapd

管理snap軟件包的後臺服務。安全

kernel snap

使用snap格式打包的內核,包含內核鏡像及內核模塊。app

OS snap

使用snap格式從新打包的rootfs,包含了運行和管理snap的基本資源,當你第一次安裝snap時,OS snap 首先被安裝。工具

snapcraftui

將軟件打包成snap格式的打包工具集。spa

snappy操作系統

原指徹底基於snap構建的系統,此名稱已棄用,現統一稱爲Ubuntu Core,即Ubuntu的全snap操做系統,有別於傳統基於deb包的classic Ubuntu命令行

 

2、安全策略

snap應用以沙箱的方式運行。系統經過一些機制限制應用訪問資源的權限來實現其安全特性,好比經過對內核安全機制AppArmorSeccomp等的配置實現的沙箱和snap文件系統等。開發者沒必要過多瞭解系統安全機制的細節。下面簡要說明snap使用的部分安全策略。

Sandbox

Linux Sandbox 是根據內核中支持的一些安全機制實現的進程訪問控制方式。一般經過爲進程分配隨機uid,將進程置於chroot環境和爲進程uid配置Capability等方式將進程置於嚴格受限的一種狀態下。snap應用使用這種方式運行在系統爲其分配的沙箱環境中。

security policy ID

每個snap應用程序命令都有惟一的security policy ID,系統將此ID與命令綁定,由此能夠爲同一snap包內的不一樣程序配置不一樣的安全策略。做爲系統識別命令的標示,當程序安裝和運行時,系統會根據其Security Policy ID爲其分配資源。在沙箱中運行的snap應用之間的通訊控制也經過此ID來進行配置。
snap應用的security policy ID的命名規則爲snap.name.command
例如,hello程序的security policy ID即爲snap.hello.hello

snap文件系統

snap文件系統被劃分爲具備只讀和讀寫兩種不一樣權限的區域,每一個snap應用有其獨有的受限文件目錄,以下圖所示:

 

能夠經過以下方式查看某應用的文件訪問權限:

$ 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應用具備寫權限的目錄是極其有限的,而且每一個snap應用都有其獨立的可寫目錄。snap文件系統對snap應用相關目錄的權限配置說明,這種方式實現了應用與應用,應用與系統之間的隔離。
同時這種方式對snap應用的升級和回滾提供了很好的支持,升級時只需將肯定版本的相關目錄複製到更高版本的對應目錄,而回退只需刪除更高版本的目錄。

AppArmor

AppArmor是一個強制訪問控制系統,在內核層面對進程可訪問的資源進行控制。 在snap應用程序安裝時,系統會爲其中的每個命令生成其特有的AppArmor配置文件。內核對可執行程序的Capability限制也能夠經過Aparmor來配置。當執行應用程序中的命令時,AppArmor機制可保證此命令不會越權訪問。 做爲一種內核中的安全機制,在ubuntu classic系統中也同時支持AppArmor提供的機制。但與classic系統不一樣,snap系統對程序的訪問控制更加嚴格,基本作到只知足程序執行所需的最小權限

Seccomp

Seccomp是一個內核接口訪問過濾器,snap應用程序經過其獨有的過濾器訪問內核接口。在snap應用程序啓動以前會自動配置過濾器。Seccompsnap系統中的做用相似於AppArmor。都是控制應用程序對系統資源的訪問。

 

3、Snap接口調用

snap應用被嚴格限制在上面介紹的安全策略下,但snap應用之間也須要進行通訊,好比硬件驅動做爲一個snap應用確定要爲使用這個硬件的應用提供接口和服務。下面就簡單說明一下snap應用之間的通訊機制。

默認安全策略

在沒有特殊配置時,snap應用使用默認的安全策略,其中包含以前提到的snap文件系統中的默認目錄訪問控制以及如下部分策略:

snap應用安裝目錄的只讀權限。

共享內存的讀寫權限(ie. /dev/shm/snap.SNAP_NAME.*)

相同應用的不一樣進程之間互相發送signal的權限

安裝模式

snap經過不一樣的安裝模式提供不一樣的資源訪問控制。

1) Devmode

devmode即爲開發模式。使用如下命令將應用安裝在此模式下:

$ 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  -

此模式爲應用程序提供徹底的訪問權限,但會在日誌中記錄程序的越權行爲。

devmode下,snap應用只能訪問/snap/<snap name>下的文件。

2) Classic

此模式將取消全部訪問限制,不會在日誌中記錄越權行爲。

classic模式下,snap應用能夠訪問’/’下的文件。

Interfaces

除去默認安全策略爲其提供的資源外,snap應用沒有權限訪問系統其它資源。若snap應用須要使用系統資源或其它應用程序提供的資源,需經過interfaces機制配置接口。interfaces接口分爲兩種,slot(服務提供者)plug(服務使用者)
snap應用訪問受限資源的示意以下:



注意:操做系統在snap系統中也做爲snap應用的形式存在。
如圖所示,經過配置snap應用的plugslot便可實現snap應用的互相訪問。
查看系統上已經存在的plugslot

$ 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]    

以上文件可做爲一個藍牙設備驅動程序的snap包打包控制文件。當此應用被安裝時,系統將爲其分配security policy IDsnap.blue.blue幷包含規則:當blue啓動時爲其建立bluez slot
要在其它應用中使用這個slot提供的功能,則打包控制文件以下所示:

name: blue-client
...
apps:
  blue-client:
    command: bin/blue-client
    plugs: [bluez]

同理,當此應用被安裝時,系統將爲其分配security policy IDsnap.blue-client.blue-client幷包含規則:容許此應用與snap.blue.blue通訊。同時,提供slot的安全規則也會改寫爲:snap.blue.blue容許snap.blue-client.blue-client與其進行通訊。
下圖說明了snap應用與應用之間在嚴格的分隔限制下的互相通訊。

 

snap系統由snap應用組成,包括系統和內核都以snap包的形式出如今系統中。各個snap包之間經過interfaces互相提供服務來完成協同工做,同時各個應用又不失自身的獨立性。

 

4、總結

snap系統提供了強大的安全系統。與傳統linux發行版相比,snap系統中的應用更加獨立、安全,同時對snap應用權限的配置也更加簡單。在日益增加的嵌入式和物聯網需求與日益嚴峻的系統安全形勢下,snap系統表現出了比傳統linux發行版更突出的優點。

相關文章
相關標籤/搜索