那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何理解這個Seccomp profile呢?

Linux閱碼場 ? 來源:內核功守道 ? 作者:許慶偉 ? 2022-11-08 09:04 ? 次閱讀

Seccomp 簡介

75aa7e0a-5efa-11ed-8abf-dac502259ad0.png


Seccomp(全稱 “Secure computing”),早在 2.6.12 版本(2005年3月8日)就引入到內核中,是通過只允許內核支持部分 syscall(系統調用),或者拒絕內核認為可能有危險的 syscall 集合的方式,來限制一個進程所支持的 syscall調用。

最初,Seccomp 只允許使用read、 write、_exit、sigreturn 4個系統調用,一旦調用其他系統調用時,內核就會發送 SIGKILL 信號終止進程。因此也被稱為 Seccomp-strict 模式。但由于其限制過于嚴格,導致實際上,并沒有多少應用能夠用的上這一安全特性。

直到 3.5 版本(2012年7月12日)的內核中引入 Seccomp的第二種匹配模式。

在這種模式下,可以通過所謂的 filter自定義被允許使用的 syscall,而自定義過濾規則是借由BPF 語言來實現,故可以事先在用戶態下定義好需要匹配的系統調用,并且加載到內核中,這種模式也被稱為Seccomp-BPF。

75b97bee-5efa-11ed-8abf-dac502259ad0.png

相比于 Seccomp-strict 模式,Seccomp-BPF 極大的增添了 syscall 的可擴展性,并且使用 BPF 編寫也大大的降低了開發者的編寫難度。

現如今,關鍵的程序限制為只允許調用那些「它絕對需要的成功運行的系統調用」,這種思想被越來越多的產品采納。基于瀏覽器的沙箱和在云原生上大火的容器就是就是兩個很好的示例,甚至于 systemd 服務也能夠通過 Seccomp 來限制。

一個 seccomp profile 簡單示例如下:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "madvise",
                "epoll_ctl",
                "getsockname",
                "setsockopt",
                "vfork",
                "mmap",
                "read",
            ],
            "action": "SCMP_ACT_ALLOW",
        }
    ]
}

如何理解這個 Seccomp profile 呢?

SCMP_ACT_ALLOW 表示syscall 允許通過,將defaultAction 設置為 SCMP_ACT_ERRNO 則不在 syscall白名單范圍內的 syscall 都會被拒絕,還可以將defaultAction 設置為 SCMP_ACT_LOG 則不在 syscall 白名單范圍內的 syscall 會產生日志。

通過 Seccomp Profile 用于可以根據服務所需的 syscall 自行定義,通過 SCMP_ACT_ERRNO 與SCMP_ACT_ALLOW 配合實現對允許的 syscall 放行,對不在 syscall 列表中的 syscall 進行攔截。從而實現 syscall維度服務的安全防護。

SCMP_ACT_LOG與SCMP_ACT_ERRNO 可以在不同場景使用,進而實現不同程度的安全防護即告警和攔截。

Linux 內核主要支持的 Seccomp Filter 動作如下:

Seccomp Filter Action Description
SCMP_ACT_KILL 當線程產生的系統調用與過濾規則相匹配時,線程將被內核以SIGSYS的方式終止。
SCMP_ACT_KILL_PROCESS 當進程產生的系統調用與過濾規則相匹配時,進程將被終止。
SCMP_ACT_TRAP 當線程產生的系統調用與過濾規則相匹配時,線程將會拋出一個SIGSYS信號。
SCMP_ACT_ERRNO 當線程產生的系統調用與過濾規則相匹配時,它將收到errno的一個返回值。
SCMP_ACT_TRACE 如果線程正在被跟蹤,并且跟蹤進程時在對ptrace(2)的調用中指定了PTRACE_O_TRACESECCOMP選項,則將會通過 PTRACE_EVENT_SECCOMP通知跟蹤進程,并且可以使用PTRACE_GETEVENTMSG 選項檢索msg_num中提供的值。
SCMP_ACT_LOG 當線程產生的系統調用與過濾規則相匹配時,則它不會對調用系統調用的線程產生任何影響,但系統調用會被記錄到日志。
SCMP_ACT_ALLOW 當線程產生的系統調用與過濾規則相匹配時,則它不會對調用系統調用的線程產生任何影響。
SCMP_ACT_NOTIFY 當進程產生與seccomp過濾規則匹配的系統調用時,內核將會通知正在監視的用戶態進程。該進程在內核中產生了系統調用等待,直到監視進程返回seccomp_notify_respond(3)。

Seccomp in Kubernetes

從安全的角度來看,Kubernetes 中包含如下所示的潛在攻擊面:

75c544ec-5efa-11ed-8abf-dac502259ad0.png

為了保證集群以及容器應用的安全,Kubernetes 提供了多種安全機制,限制容器的行為,減少容器和集群的攻擊面,保證整個系統的安全性。

本文主要介紹 Kubernetes 中的 Seccomp 功能。Seccomp (Secure computing mode縮寫)代表安全計算模式,自 2.6.12 版本以來一直是 Linux 內核的一個特性。它可以用來設置沙箱化進程的權限,限制它從用戶空間到內核的系統調用。Kubernetes 可以自動將 Seccomp profile 加載到pod 和容器所在的節點。Kubernetes 提供兩種方式用于 pod 綁定 seccomp profile。

通過 annotation 標簽綁定 seccomp profile

用戶可以通過 pod 中的 annotation 標簽向 pod 中添加seccomp 安全配置,并且可以選擇對 pod 添加 seccomp 還是對 pod 中某個容器添加 seccomp 策略。

pod 層面:

annotations:
seccomp.security.alpha.kubernetes.io/pod: "localhost/profile.json"

container 層面:

annotations:
container.security.alpha.kubernetes.io/: "localhost/profile.json"

這里容器運行時會默認從節點上配置的 seccomp 策略文件目錄(k8s 集群上默認為/var/lib/kubelet/seccomp)中加載名稱為 profile.json 的配置文件,這里的配置 value 支持以下三種策略:

runtime/default-使用運行時默認的 seccomp 配置,比如docker 默認的 profile、containerd 的默認 profile

unconfined-不使用 seccomp 過濾

localhost/-使用節點本地 seccompprofileroot 路徑下自定義的配置文件

注意:從 Kubernetes v1.25 開始,kubelet 不再支持這些注解,也不再支持在靜態 Pod 中使用注解,并且當創建帶有 seccomp 字段的 Pod 時不再自動填充 seccomp 注解。后續統一使用下面介紹的 securityContext 配置。

通過 security-context 配置 seccompprofile

社區從 1.19 版本 seccomp 特性 GA 開始在securityContext 配置中增加了 seccompProfile 的字段,用戶可以直接在此配置 Pod 和 Container 維度的 seccomp策略,由于 annotations 配置的方式已經是廢棄狀態,為了今后不必要的兼容性調整,推薦使用該方式配置:

securityContext:
 seccompProfile:
 type: Localhost
 localhostProfile: profiles/audit.json

有三種 seccomp 配置類型:

Unconfined:不啟用 seccomp

RuntimeDefault: kubelet 會啟用默認的 seccomp 配置(默認 seccomp 配置文件是有容器運行時定義的)

Localhost:節點本地seccomp 配置根目錄(一般默認為/var/lib/kubelet/seccomp)下配置文件的相對路徑

所以基于 k8s 提供的 seccomp 配置方式,我們可以實現對 pod 進行 syscall 級別的安全防護。

Seccomp 在云原生場景下的應用方式

云原生場景下,業務一般是通過微服務的方式對外提供服務,一般每個微服務的行為相比與主機業務行為會更為單一。因此當通過一系列的測試手段激發出服務所需的全部syscall 從而生成 syscall 白名單,通過 syscall 白名單限制服務系統調用,可以在 syscall 維度保證服務安全。當有攻擊通過服務漏洞進入到服務對應的 Pod 中,它想要進行一些操作,但這些操作對應的 syscall 不在白名單內,此時攻擊失敗。

我們將 syscall 白名單的生成與使用分為三個階段:學習階段,監視階段,保護階段。

整個過程如圖所示:

76092cb6-5efa-11ed-8abf-dac502259ad0.png

學習階段:seccomp controller 組件為 crd 資源,它可以實現對 k8s 集群內指定 pod 進行 syscall 采集并且將采集得到的 syscall 列表落盤到每個工作節點。seccomp controller 的 syscall 學習功能是通過 eBPF實現的,通過eBPF可以獲取工作節點每個進程產生的系統調用,進而獲取到指定 pod 對應的系統調用。通過eBPF的方式,將集群中每個容器產生的 syscall 調用進行收集,生成 syscall 白名單。

監視階段:使用 SCMP_ACT_LOG 過濾方式,可以將不在白名單的系統調用,以日志的形式打印出來,此時測試人員和安全運維人員可以對系統調用進行判斷,確定業務是否需要該 syscall,如果需要則加入到 syscall 白名單中。在監視階段可以完成 syscall 白名單的收斂,進而得到與業務完全匹配的 syscall 白名單。

監視模式創建的 seccomp 配置文件如下所示:(syscall列表只是舉例,實際 Pod 所需 syscall 列表會更多)

{
  "defaultAction": "SCMP_ACT_LOG",
  "architectures": [
      "SCMP_ARCH_X86_64",
      "SCMP_ARCH_X86",
      "SCMP_ARCH_X32"
  ],
 "syscalls": [
     {
         "names": [
             "madvise",
             "epoll_ctl",
             "getsockname",
             "setsockopt",
"vfork",
             "mmap",
             "read",
             "write",
             "close",
             "arch_prctl"
         ],
 "action": "SCMP_ACT_ALLOW"
     }
]
}

保護階段:使用 SCMP_ACT_ERRNO 過濾方式,對每個業務容器進行 syscall 級別的保護。一旦業務容器中存在異常系統調用,對其進行攔截。

SCMP_ACT_ERRNO 對 syscall 攔截發生在內核態,所以不用擔心 seccomp profile 安全防護的效率問題。

保護模式創建的 seccomp 配置文件如下所示:

{
       "defaultAction":"SCMP_ACT_ERRNO",
       "architectures": [
           "SCMP_ARCH_X86_64",
           "SCMP_ARCH_X86",
           "SCMP_ARCH_X32"
      ],
      "syscalls": [
          {
              "names": [
                  "madvise",
                  "epoll_ctl",
                  "getsockname",
                  "setsockopt",
"vfork",
                  "mmap",
                  "read",
                  "write",
"close",
                  "arch_prctl"
      ],
"action":"SCMP_ACT_ALLOW"
           }
]
}

總結

本文從 Seccomp 機制出發,在 linux 內核層面介紹了 Seccomp 可以實現的安全能力即對進程的系統調用限制能力。

Kubernetes 為我們提供了可以對容器進行系統調用層面保護的接口即 Seccomp 能力。在云原生場景,通過使用 eBPF獲取業務系統調用白名單,通過linux 內核支持的 Seccomp 機制對業務容器進行系統調用維度的防護,進而保證業務容器 syscall 層面的安全。

一旦有攻擊者希望通過不在白名單內的 syscall 實現攻擊行為,通過 Seccomp 機制我們可以對攻擊進行告警和攔截,最終保證業務容器的安全。

Seccomp 機制為云原生場景提供了 Syscall 維度的安全保證,后續將對此持續探索。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Act
    Act
    +關注

    關注

    0

    文章

    14

    瀏覽量

    21019
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21744
  • BPF
    BPF
    +關注

    關注

    0

    文章

    25

    瀏覽量

    4055

原文標題:【云安全系列】Seccomp—云安全syscall防護利器

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    /etc/bashrc和/etc/profile區別

    都有什么作用和該如何使用? 首先我們 在一般的 linux 或者 unix 系統中, 都可以通過編輯 bashrc 和 profile 來設置用戶的工作環境, 很多文章對于 profile
    發表于 06-26 16:26

    out of box例程,默認STA狀態,自動connect to a stored profile。stored profile在哪兒?

    我現在在學習CC3220SF開發板的out_of_box例程,遇到一個問題。 在例程中,板子上電后會被自動設置為STATION狀態,首先從一個默認的stored profile連接WIFI,但是這個stored profile
    發表于 05-14 08:54

    CCS中性能分析器profile的使用?

    專家好, CCS調試程序過程中,需要分析下各函數的執行時間,CCS中提供了性能分析器profile Q1:性能分析器profile是否只能在Simulator下才能使用,Emulator下沒有這個功能? Q2:性能分析器
    發表于 06-21 19:20

    請教關于CCS v4.2 中profile工具的使用

    ,另一個子函數的情況則沒顯示?。≡鯓咏鉀Q?PS:使用的是C64+ simulator 進行仿真;profile setup選擇的是 Profile all functions for total cycle
    發表于 08-07 08:25

    請問AD9914單頻模式使用Profile寄存器時必須用Profile引腳選擇所需的寄存器嗎?

    你好,我看到ad9914手冊講單頻模式時,在使用Profile寄存器時,必須用Profile引腳選擇所需的寄存器嗎?Profile的三個引腳怎么設置來選擇Profile寄存器
    發表于 02-12 11:31

    請問這個函數該怎樣理解?

    __asm void WFI_SET(void){ WFI; }這個函數該怎樣理解?
    發表于 10-21 03:39

    請問需要認證哪些profile和service?

    請問基于CC2541的HIDAdvRemoteDongle歷程的項目做BQB認證時認證哪些profile和service,這個HID的host只掃面和讀取從機HID設備的profile和service,那么它需不需要認證,如需要
    發表于 11-05 08:35

    如何理解增益裕度這個概念?

    如何理解增益裕度這個概念?如果有資料,請分享一下,謝謝[/td]
    發表于 06-24 07:01

    應該怎么去理解AC magnitude 這個參數?它為什么會影響增益?

    請問在做AC仿真的時候參數設置AC magnitude到底應該怎么理解?我跑AC的時候將其減小一般為什么增益也減半了? 它為什么會影響增益?應該怎么去理解AC magnitude 這個參數
    發表于 06-24 07:55

    ZIC2410 User Guide Profile-Sim

    This is the user manual for the CEL Profile-Simulator. The Profile-Simulator is used forsimulating
    發表于 11-04 14:29 ?12次下載

    ZIC2410 User Guide Profile-Bui

    This is the user manual for the CEL Profile-Builder program. Profile-Builder helps a usereasily
    發表于 11-04 14:32 ?19次下載

    藍牙耳機的支援Profile

    藍牙耳機的支援Profile              若支持藍牙功能的手機與藍牙耳機相用,藍牙耳機必須支持兩個協議:Headset profile
    發表于 12-31 11:55 ?979次閱讀

    Xysemi_Company_Profile

    Xysemi Company Profile PPT資料
    發表于 03-03 16:06 ?3次下載

    藍牙個各種profile標準

    藍牙個各種profile標準,適合不同類型的產品定制。
    發表于 03-13 14:56 ?10次下載

    如何通過仿真動圖理解各種傳感器的原理?

    如何通過仿真動圖理解各種傳感器的原理
    發表于 01-15 10:39 ?559次閱讀
    如何通過仿真動圖<b class='flag-5'>理解</b>各種傳感器的原理<b class='flag-5'>呢</b>?
    百家乐官网博之道娱乐城| 亚洲百家乐官网的玩法技巧和规则| 太阳城娱乐城官方网| 立即博百家乐娱乐城| 金盈会百家乐现金网| 百家乐官网那个娱乐城信誉好| 利都百家乐官网国际娱乐| 百家乐官网闲庄和| 百家乐官网怎样出千| 百家乐官网庄闲符号记| 嘉鱼县| 百家乐官网有电脑游戏吗| 德州扑克保险| 百家乐园天将| 大发888官方 df888gfxzylc8| 顶级赌场是骗人的吗| 娱乐城免费送体验金| 百家乐官网线上游戏| 百家乐官网开和几率| 真人百家乐官网蓝盾娱乐场| 手机棋牌游戏下载| 百家乐官网玩法及细则| 使用的百家乐官网软件| 百家乐官网谁能看准牌| 百家乐客户端软件| 广州百家乐赌场娱乐网规则| bet365 日博| 娱乐城百家乐官网可以代理吗 | 上海二八杠分析仪| 湘潭市| 百家乐官网返点| 沙龙百家乐娱乐网| 大发888帐号注册| 美国百家乐官网怎么玩| 百家乐桩闲落注点| 大发888怎么下载不了| 在线百家乐官网技巧| 百家乐官网首页红利| 大佬百家乐娱乐城| 百家乐官网销售视频| 肯博百家乐游戏|