Seccomp Π² Kubernetes: 7 Π²Π΅Ρ‰Π΅ΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ с самого Π½Π°Ρ‡Π°Π»Π°

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².: ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅ΠΌ вниманию ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π° ΠΏΠΎ бСзопасности ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ британской ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ASOS.com. Π‘ Π½Π΅ΠΉ ΠΎΠ½ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ†ΠΈΠΊΠ» ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ, посвящённых ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡŽ бСзопасности Π² Kubernetes благодаря использованию seccomp. Если Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ понравится читатСлям, ΠΌΡ‹ послСдуСм Π·Π° Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ с Π΅Π³ΠΎ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΌΠΈ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Π°ΠΌΠΈ ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅.

Seccomp Π² Kubernetes: 7 Π²Π΅Ρ‰Π΅ΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ с самого Π½Π°Ρ‡Π°Π»Π°

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ β€” пСрвая ΠΈΠ· сСрии ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΉ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ seccomp Π² Π΄ΡƒΡ…Π΅ SecDevOps, Π½Π΅ прибСгая ΠΊ ΠΌΠ°Π³ΠΈΠΈ ΠΈ колдовству. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ части я расскаТу ΠΎΠ± основах ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… дСталях Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ seccomp Π² Kubernetes.

ЭкосистСма Kubernetes ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ достаточноС Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ способов ΠΏΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΡŽ бСзопасности ΠΈ изоляции ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Π‘Ρ‚Π°Ρ‚ΡŒΡ посвящСна Secure Computing Mode, Ρ‚Π°ΠΊΠΆΠ΅ извСстному ΠΊΠ°ΠΊ seccomp. Π•Π³ΠΎ ΡΡƒΡ‚ΡŒ состоит Π² Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², доступных для выполнСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ? ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ β€” это всСго лишь Π½Π΅ΠΊΠΈΠΉ процСсс, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ машинС. И ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ядро Π½Π°Ρ€Π°Π²Π½Π΅ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ прилоТСниями. Если Π±Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, вСсьма скоро этим Π±Ρ‹ воспользовались врСдоносныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΈΠ·ΠΎΠ»ΡΡ†ΠΈΡŽ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΈ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ прилоТСния: ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΌΠ΅Π½ΡΡ‚ΡŒ настройки систСмы ΠΈ Ρ‚.ΠΏ.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈ seccomp ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, ΠΊΠ°ΠΊΠΈΠ΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ ΠΈΠ»ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹. Π‘Ρ€Π΅Π΄Π° исполнСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… Π²ΠΎ врСмя Π΅Π³ΠΎ запуска, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ядро ΠΌΠΎΠ³Π»ΠΎ вСсти ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π·Π° ΠΈΡ… исполнСниСм. ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ позволяСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π°Ρ‚Π°ΠΊΠΈ ΠΈ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ΡƒΡ€ΠΎΠ½ Π² случаС, Ссли какая-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ваши зависимости, ΠΈΠ»ΠΈ ΠΈΡ… зависимости) Π½Π°Ρ‡Π½Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΉ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ.

РазбираСмся с основами

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ seccomp Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ элСмСнта: defaultAction, architectures (ΠΈΠ»ΠΈ archMap) ΠΈ syscalls:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "sched_yield",
                "futex",
                "write",
                "mmap",
                "exit_group",
                "madvise",
                "rt_sigprocmask",
                "getpid",
                "gettid",
                "tgkill",
                "rt_sigaction",
                "read",
                "getpgrp"
            ],
            "action": "SCMP_ACT_ALLOW"
        }
    ]
}

(medium-basic-seccomp.json)

defaultAction опрСдСляСт ΡΡƒΠ΄ΡŒΠ±Ρƒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ любого систСмного Π²Ρ‹Π·ΠΎΠ²Π°, Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ syscalls. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, сосрСдоточимся Π½Π° Π΄Π²ΡƒΡ… основных значСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ:

  • SCMP_ACT_ERRNO β€” Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ систСмного Π²Ρ‹Π·ΠΎΠ²Π°,
  • SCMP_ACT_ALLOW β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚.

Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ architectures ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ†Π΅Π»Π΅Π²Ρ‹Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ сам Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, примСняСмый Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ядра, зависит ΠΎΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π° Π½Π΅ ΠΎΡ‚ ΠΈΡ… Π½Π°Π·Π²Π°Π½ΠΈΠΉ, прописанных Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅. ΠŸΠ΅Ρ€Π΅Π΄ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ срСда исполнСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° сопоставит ΠΈΡ… с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ. Бмысл Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π·Π½Ρ‹Π΅ ID Π² зависимости ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ систСмы. НапримСр, систСмный Π²Ρ‹Π·ΠΎΠ² recvfrom (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΡ‚ сокСта) ΠΈΠΌΠ΅Π΅Ρ‚ ID = 64 Π² x64-систСмах ΠΈ ID = 517 Π² x86. Π—Π΄Π΅ΡΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ список всСх систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ x86-x64.

Π’ сСкции syscalls ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ всС систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΈ указываСтся, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌΠΈ слСдуСт Π΄Π΅Π»Π°Ρ‚ΡŒ. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π΅Π»Ρ‹ΠΉ список, установив defaultAction Π½Π° SCMP_ACT_ERRNO, Π° Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ Π² сСкции syscalls ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ SCMP_ACT_ALLOW. Π’Π΅ΠΌ самым Π²Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹, прописанныС Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ syscalls, ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚Π΅ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. Для Ρ‡Ρ‘Ρ€Π½ΠΎΠ³ΠΎ списка слСдуСт ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ значСния defaultAction ΠΈ дСйствия Π½Π° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½Ρ‹Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ слСдуСт ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Ρƒ слов ΠΎ Π½ΡŽΠ°Π½ΡΠ°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ Π½ΠΈΠΆΠ΅ исходят ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π°Π·Π²ΠΎΠ°Ρ€Ρ‡ΠΈΠ²Π°Π΅Ρ‚Π΅ Π»ΠΈΠ½Π΅ΠΉΠΊΡƒ бизнСс-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Kubernetes ΠΈ Π²Π°ΠΌ Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с наимСньшими привилСгиями.

1. AllowPrivilegeEscalation=false

Π’ securityContext ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° имССтся ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ AllowPrivilegeEscalation. Если ΠΎΠ½ установлСн Π² false, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ с установлСнным (on) Π±ΠΈΡ‚ΠΎΠΌ no_new_priv. Бмысл этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ ΠΈΠ· названия: ΠΎΠ½ Π½Π΅ позволяСт ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ процСссы с привилСгиями, бóльшими, Ρ‡Π΅ΠΌ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρƒ Π½Π΅Π³ΠΎ самого.

ΠŸΠΎΠ±ΠΎΡ‡Π½Ρ‹ΠΌ эффСктом этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, установлСнного Π² true (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ runtime ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° примСняСт ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ seccomp Π² самом Π½Π°Ρ‡Π°Π»Π΅ процСсса запуска. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всС систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для запуска Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… процСссов срСды исполнСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, установка ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ/Π³Ρ€ΡƒΠΏΠΏΡ‹, отбрасываниС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… capabilities), Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт банальноС echo hi, ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "brk",
                "capget",
                "capset",
                "chdir",
                "close",
                "execve",
                "exit_group",
                "fstat",
                "fstatfs",
                "futex",
                "getdents64",
                "getppid",
                "lstat",
                "mprotect",
                "nanosleep",
                "newfstatat",
                "openat",
                "prctl",
                "read",
                "rt_sigaction",
                "statfs",
                "setgid",
                "setgroups",
                "setuid",
                "stat",
                "uname",
                "write"
            ],
            "action": "SCMP_ACT_ALLOW"
        }
    ]
}

(hi-pod-seccomp.json)

… вмСсто этих:

{
    "defaultAction": "SCMP_ACT_ERRNO",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "brk",
                "close",
                "execve",
                "exit_group",
                "futex",
                "mprotect",
                "nanosleep",
                "stat",
                "write"
            ],
            "action": "SCMP_ACT_ALLOW"
        }
    ]
}

(hi-container-seccomp.json)

Но ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°? Π›ΠΈΡ‡Π½ΠΎ я ΠΈΠ·Π±Π΅Π³Π°Π» Π±Ρ‹ внСсСния Π² Π±Π΅Π»Ρ‹ΠΉ список ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² (Ссли Π² Π½ΠΈΡ… Π½Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ нСобходимости): capset, set_tid_address, setgid, setgroups ΠΈ setuid. Однако настоящая ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ процСссы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅, Π²Ρ‹ привязываСтС ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ срСды исполнСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ послС обновлСния runtime-срСды ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° (Π²Π°ΠΌΠΈ ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ вСроятнСС, поставщиком ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… услуг) ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ пСрСстанут Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ.

Π‘ΠΎΠ²Π΅Ρ‚ β„–1: ЗапускайтС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ с AllowPrivilegeEscaltion=false. Π­Ρ‚ΠΎ сократит Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ seccomp ΠΈ сдСлаСт ΠΈΡ… ΠΌΠ΅Π½Π΅Π΅ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΊ измСнСнию срСды исполнСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

2. Π—Π°Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ seccomp Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΡŒ seccomp ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ pod’Π°:

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

… ΠΈΠ»ΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°:

annotations:
  container.security.alpha.kubernetes.io/<container-name>: "localhost/profile.json"

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ синтаксис измСнится, ΠΊΠΎΠ³Π΄Π° Kubernetes seccomp станСт GA (это событиС оТидаСтся ΡƒΠΆΠ΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π΅Π»ΠΈΠ·Π΅ Kubernetes β€” 1.18 β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π².).

Мало ΠΊΡ‚ΠΎ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² Kubernetes всСгда имСлся Π±Π°Π³, ΠΈΠ·-Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ seccomp ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΠ»ΠΈΡΡŒ ΠΊ pause-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρƒ. Π‘Ρ€Π΅Π΄Π° исполнСния частично компСнсируСт Π΄Π°Π½Π½Ρ‹ΠΉ нСдостаток, ΠΎΠ΄Π½Π°ΠΊΠΎ этот ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½ΠΈΠΊΡƒΠ΄Π° Π½Π΅ дСваСтся ΠΈΠ· pod’ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для настройки ΠΈΡ… инфраструктуры.

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΆΠ΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ всСгда запускаСтся с AllowPrivilegeEscalation=true, приводя ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ, ΠΎΠ·Π²ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² ΠΏΡƒΠ½ΠΊΡ‚Π΅ 1, ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ seccomp Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π²Ρ‹ ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ‚Π΅ Π΄Π°Π½Π½ΠΎΠΉ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Β«Π·Π°Ρ‚ΠΎΡ‡Π΅Π½Β» ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Π’Π°ΠΊ придСтся Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ исправят Π±Π°Π³ ΠΈ новая вСрсия (ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, 1.18?) станСт доступна для всСх ΠΆΠ΅Π»Π°ΡŽΡ‰ΠΈΡ….

Π‘ΠΎΠ²Π΅Ρ‚ β„–2: Π—Π°Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ seccomp Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

Π’ практичСском смыслС это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ слуТит ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ Π½Π° вопрос: Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΠΎΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ seccomp Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с docker run, Π½ΠΎ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ послС развСртывания Π² кластСрС Kubernetes?Β».

3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ runtime/default Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΡ€Π°ΠΉΠ½Π΅ΠΌ случаС

Π’ Kubernetes имССтся Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° встроСнных ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ: runtime/default ΠΈ docker/default. Оба Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ΡΡ срСдой исполнСния ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°, Π° Π½Π΅ Kubernetes. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π² зависимости ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ срСды исполнСния ΠΈ Π΅Ρ‘ вСрсии.

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ смСны runtime ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ Π½Π°Π±ΠΎΡ€Ρƒ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ срСд исполнСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Docker. Если Π²Ρ‹ ΠΆΠ΅Π»Π°Π΅Ρ‚Π΅ Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π²Π°ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚.

ΠŸΡ€ΠΎΡ„ΠΈΠ»ΡŒ docker/default считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ с Kubernetes 1.11, поэтому ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π΅Π³ΠΎ примСнСния.

По ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ runtime/default прСкрасно ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ‚Π΅Ρ… Ρ†Π΅Π»Π΅ΠΉ, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ создавался: Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΎΡ‚ рисков, связанных с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ docker run Π½Π° ΠΈΡ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…. Однако Ссли Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ бизнСс-прилоТСниях, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… Π² кластСрах Kubernetes, я Π±Ρ‹ взял Π½Π° сСбя ΡΠΌΠ΅Π»ΠΎΡΡ‚ΡŒ ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ слишком ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΊΠΎΠ½Ρ†Π΅Π½Ρ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° создании ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ ΠΏΠΎΠ΄ свои прилоТСния (ΠΈΠ»ΠΈ Ρ‚ΠΈΠΏΡ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ).

Π‘ΠΎΠ²Π΅Ρ‚ β„–3: Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ seccomp ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ прилоТСния. Если это Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°ΠΉΠΌΠΈΡ‚Π΅ΡΡŒ профилями ΠΏΠΎΠ΄ Π²ΠΈΠ΄Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, создайтС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Π² сСбя всС Π²Π΅Π±-API прилоТСния Π½Π° Golang. Волько Π² качСствС ΠΊΡ€Π°ΠΉΠ½Π΅Π³ΠΎ срСдства ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ runtime/default.

Π’ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… публикациях я расскаТу, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ seccomp Π² Π΄ΡƒΡ…Π΅ SecDevOps, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π°Ρ…. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρƒ вас Π½Π΅ останСтся ΠΎΠΏΡ€Π°Π²Π΄Π°Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ прилоТСния.

4. Unconfined β€” это НЕ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚

Из ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π°ΡƒΠ΄ΠΈΡ‚Π° бСзопасности Kubernetes Π²Ρ‹ΡΡΠ½ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ seccomp ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ Π½Π΅ Π·Π°Π΄Π°Π΄ΠΈΡ‚Π΅ PodSecurityPolicy, которая Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Π΅Π³ΠΎ Π² кластСрС, всС pod’Ρ‹, для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ seccomp, Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ seccomp=unconfined.

Π Π°Π±ΠΎΡ‚Π° Π² Ρ‚Π°ΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ тСряСтся Ρ†Π΅Π»Ρ‹ΠΉ слой изоляции, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π·Π°Ρ‰ΠΈΡ‚Ρƒ кластСра. ΠŸΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ рСкомСндуСтся спСциалистами ΠΏΠΎ бСзопасности.

Π‘ΠΎΠ²Π΅Ρ‚ β„–4: Ни ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π² кластСрС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ seccomp=unconfined, особСнно Π² production-срСдах.

5. Β«Π Π΅ΠΆΠΈΠΌ Π°ΡƒΠ΄ΠΈΡ‚Π°Β»

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½ для Kubernetes, Π½ΠΎ всё ΠΆΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Β«ΠΎ Ρ‡Ρ‘ΠΌ слСдуСт Π·Π½Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ Π΄ΠΎ Π½Π°Ρ‡Π°Π»Π°Β».

Π’Π°ΠΊ повСлось, Ρ‡Ρ‚ΠΎ созданиС ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΉ seccomp всСгда Π±Ρ‹Π»ΠΎ нСпростым занятиСм ΠΈ Π² Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ стСпСни ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°Π»ΠΎΡΡŒ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ± ΠΈ ошибок. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ просто Π½Π΅Ρ‚ возмоТности ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… Π² production-срСдах, Π½Π΅ рискуя Β«ΡƒΡ€ΠΎΠ½ΠΈΡ‚ΡŒΒ» ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

ПослС появлСния ядра Linux 4.14 появилась Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ части профиля Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π°ΡƒΠ΄ΠΈΡ‚Π°, записывая Π² syslog ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΠΎ всСх систСмных Π²Ρ‹Π·ΠΎΠ²Π°Ρ…, Π½ΠΎ Π½Π΅ блокируя ΠΈΡ…. ΠΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ€Π΅ΠΆΠΈΠΌ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° SCMT_ACT_LOG:

SCMP_ACT_LOG: seccomp Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π΄Π΅Π»Π°ΡŽΡ‰Π΅Π³ΠΎ систСмный Π²Ρ‹Π·ΠΎΠ², Ссли ΠΎΠ½ Π½Π΅ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠ· Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, ΠΎΠ΄Π½Π°ΠΊΠΎ информация ΠΎ систСмном Π²Ρ‹Π·ΠΎΠ²Π΅ Π±ΡƒΠ΄Π΅Ρ‚ внСсСна Π² ΠΆΡƒΡ€Π½Π°Π».

Π’ΠΎΡ‚ типовая стратСгия использования этой возмоТности:

  1. Π Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹.
  2. Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ систСмы Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… извСстно, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ пригодятся.
  3. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ±ΠΎ всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π²Ρ‹Π·ΠΎΠ²Π°Ρ… Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² ΠΆΡƒΡ€Π½Π°Π».

Π£ΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

{
    "defaultAction": "SCMP_ACT_LOG",
    "architectures": [
        "SCMP_ARCH_X86_64",
        "SCMP_ARCH_X86",
        "SCMP_ARCH_X32"
    ],
    "syscalls": [
        {
            "names": [
                "arch_prctl",
                "sched_yield",
                "futex",
                "write",
                "mmap",
                "exit_group",
                "madvise",
                "rt_sigprocmask",
                "getpid",
                "gettid",
                "tgkill",
                "rt_sigaction",
                "read",
                "getpgrp"
            ],
            "action": "SCMP_ACT_ALLOW"
        },
        {
            "names": [
                "add_key",
                "keyctl",
                "ptrace"
            ],
            "action": "SCMP_ACT_ERRNO"
        }
    ]
}

(medium-mixed-seccomp.json)

Но ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… извСстно, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ способны Π½Π°Π²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ кластСру. Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ основой для составлСния списка являСтся ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ докумСнтация Docker. Π’ Π½Π΅ΠΉ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π² ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ.

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ΄Π²ΠΎΡ…. Π₯отя SCMT_ACT_LOG поддСрТиваСтся ядром Linux с ΠΊΠΎΠ½Ρ†Π° 2017 Π³ΠΎΠ΄Π°, Π² экосистСму Kubernetes ΠΎΠ½ Π²ΠΎΡˆΡ‘Π» лишь ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для использования этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° понадобятся ядро Linux 4.14 ΠΈ runC вСрсии Π½Π΅ Π½ΠΈΠΆΠ΅ v1.0.0-rc9.

Π‘ΠΎΠ²Π΅Ρ‚ β„–5: ΠŸΡ€ΠΎΡ„ΠΈΠ»ΡŒ Ρ€Π΅ΠΆΠΈΠΌΠ° Π°ΡƒΠ΄ΠΈΡ‚Π° для тСстирования Π² production ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, комбинируя Ρ‡Π΅Ρ€Π½Ρ‹ΠΉ ΠΈ Π±Π΅Π»Ρ‹ΠΉ списки, Π° всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π² ΠΆΡƒΡ€Π½Π°Π».

6. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π±Π΅Π»Ρ‹Π΅ списки

Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π΅Π»Ρ‹Ρ… списков Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… усилий, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ приходится ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, ΠΎΠ΄Π½Π°ΠΊΠΎ этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ изрядно ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ:

ΠΠ°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π° основС Π±Π΅Π»Ρ‹Ρ… списков, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½Π΅Π΅. Π§Ρ‘Ρ€Π½Ρ‹ΠΉ список Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ всякий Ρ€Π°Π· ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ опасного систСмного Π²Ρ‹Π·ΠΎΠ²Π° (ΠΈΠ»ΠΈ опасного Ρ„Π»Π°Π³Π°/ΠΎΠΏΡ†ΠΈΠΈ, Ссли ΠΎΠ½ΠΈ находятся Π² Ρ‡Ρ‘Ρ€Π½ΠΎΠΌ спискС). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, часто ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ прСдставлСниС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π½Π΅ мСняя Π΅Π³ΠΎ ΡΡƒΡ‚ΡŒ ΠΈ Ρ‚Π΅ΠΌ самым ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ограничСния Ρ‡Ρ‘Ρ€Π½ΠΎΠ³ΠΎ списка.

Для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° языкС Go я Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π» ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ инструмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сопровоТдаСт ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ собираСт всС Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹Π΅ Π²ΠΎ врСмя выполнСния. НапримСр, для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ прилоТСния:

package main

import "fmt"

func main() {
	fmt.Println("test")
}

… запустим gosystract Ρ‚Π°ΠΊ:

go install https://github.com/pjbgf/gosystract
gosystract --template='{{- range . }}{{printf ""%s",n" .Name}}{{- end}}' application-path

… ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

"sched_yield",
"futex",
"write",
"mmap",
"exit_group",
"madvise",
"rt_sigprocmask",
"getpid",
"gettid",
"tgkill",
"rt_sigaction",
"read",
"getpgrp",
"arch_prctl",

Пока это лишь ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” подробности ΠΎΠ± инструмСнтарии Π±ΡƒΠ΄ΡƒΡ‚ дальшС.

Π‘ΠΎΠ²Π΅Ρ‚ β„–6: Π Π°Π·Ρ€Π΅ΡˆΠ°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹, ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠΉΡ‚Π΅ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅.

7. Π—Π°Π»ΠΎΠΆΠΈΡ‚Π΅ Π²Π΅Ρ€Π½Ρ‹Π΅ основы (ΠΈΠ»ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΡŒΡ‚Π΅ΡΡŒ ΠΊ Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½ΠΎΠΌΡƒ повСдСнию)

Π―Π΄Ρ€ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° соблюдСниСм профиля нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π² Π½Ρ‘ΠΌ прописали. Π”Π°ΠΆΠ΅ Ссли это Π½Π΅ совсСм Ρ‚ΠΎ, Ρ‡Π΅Π³ΠΎ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ. НапримСр, Ссли Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ ΠΊ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌ Π²Ρ€ΠΎΠ΄Π΅ exit ΠΈΠ»ΠΈ exit_group, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π΅ смоТСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π΄Π°ΠΆΠ΅ простая ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ‚ΠΈΠΏΠ° echo hi подвСсит Π΅Π³ΠΎ Π½Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ срок. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π²Ρ‹ΡΠΎΠΊΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ CPU Π² кластСрС:

Seccomp Π² Kubernetes: 7 Π²Π΅Ρ‰Π΅ΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ с самого Π½Π°Ρ‡Π°Π»Π°

Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Π½Π° Π²Ρ‹Ρ€ΡƒΡ‡ΠΊΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° strace β€” ΠΎΠ½Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚, Π² Ρ‡Ρ‘ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:

Seccomp Π² Kubernetes: 7 Π²Π΅Ρ‰Π΅ΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ с самого Π½Π°Ρ‡Π°Π»Π°
sudo strace -c -p 9331

Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ содСрТат всС систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π‘ΠΎΠ²Π΅Ρ‚ β„–7: Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅ΡΡŒ ΠΊ ΠΌΠ΅Π»ΠΎΡ‡Π°ΠΌ ΠΈ провСряйтС, Ρ‡Ρ‚ΠΎ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² Π±Π΅Π»Ρ‹ΠΉ список.

На этом пСрвая Ρ‡Π°ΡΡ‚ΡŒ Ρ†ΠΈΠΊΠ»Π° статСй ΠΎΠ± использовании seccomp Π² Kubernetes Π² Π΄ΡƒΡ…Π΅ SecDevOps ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… частях ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ ΠΈ ΠΊΠ°ΠΊ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс.

P.S. ΠΎΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π² нашСм Π±Π»ΠΎΠ³Π΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com