🐳 ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ΠΎΠ±Ρ€Π°Π·Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Docker

смСна ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Docker

by itisgood

1. ΠžΠ±Π·ΠΎΡ€

Π’ этом руководствС ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π² ΠΎΠ±Ρ€Π°Π·Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Docker.

2. ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ?

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π³Ρ€ΡƒΠΏΠΏ Π² Linux – это Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ контроля доступа ΠΈ бСзопасности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ.

Π­Ρ‚ΠΎ позволяСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π²Π°ΠΆΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ нСсанкционированный доступ.

Как слСдствиС, это Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ…Π½ΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ Π² случаС Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ бСзопасности.

Π’ контСкстС Docker Π»ΡƒΡ‡ΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ бСзопасности считаСтся ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ запуска ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹ Docker ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ядро с хост-систСмой, запуск ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ root-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎΠ΄Π²Π΅Ρ€Π³Π°Π΅Ρ‚ всю систСму ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π°Ρ‚Π°ΠΊΠ°ΠΌ.

К соТалСнию, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΎΠ±Ρ€Π°Π·ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ этот риск, рСкомСндуСтся всСгда ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ Π½Π° Π½Π΅ root-ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ΠΎΠ±Ρ€Π°Π·Π°Ρ… Docker.

Π’Π΅ΠΌ самым ΠΌΡ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΡ‰Π΅Ρ€Π± ΠΎΡ‚ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ бСзопасности ΠΈ обСспСчиваСм Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ нашСй систСмы.

3. ΠŸΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ создании ΠΎΠ±Ρ€Π°Π·Π° Docker

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· Docker, ΠΌΡ‹ пишСм ряд инструкций Π² Dockerfile.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ выполняСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ docker build, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Dockerfile Π² ΠΎΠ±Ρ€Π°Π· Docker.

На протяТСнии всСх шагов ΠΌΡ‹ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ»ΠΈ для установки ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΎΠ±Ρ€Π°Π·Π° Docker.

Π’ Dockerfile ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ шаги, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ USER.

3.1. Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° USER

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° USER Π² Dockerfile Π·Π°Π΄Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ (UID) ΠΈ, ΠΏΠΎ ТСланию, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π³Ρ€ΡƒΠΏΠΏΡ‹ (GID) ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… этапах сборки.

ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ смСн ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ USER Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ.

Одним ΠΈΠ· распространСнных Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² являСтся Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root для установки зависимостСй, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… эскалации, ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅Π³ΠΎΡΡ root.

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° USER Π² Dockerfile ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π³Ρ€ΡƒΠΏΠΏΡ‹, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ:

USER <user>[:<group>]

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, синтаксис Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ UID ΠΈ GID Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ:

USER <UID>[:<GID>]

Если Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π΅Ρ‚ основной Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΈ ΠΌΡ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π³Ρ€ΡƒΠΏΠΏΡƒ ΠΏΡ€ΠΈ использовании Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ USER, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π³Ρ€ΡƒΠΏΠΏΠ° root.

3.2. ИспользованиС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ USER

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, Π΄Π°Π²Π°ΠΉΡ‚Π΅ собСрСм простой ΠΎΠ±Ρ€Π°Π· Π½Π° основС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° Alpine Linux с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ root:

$ cat Dockerfile
FROM alpine:3.18.0

WORKDIR /tmp

RUN touch file
CMD ls -lh .

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π² Dockerfile Π² качСствС Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Π° указываСтся alpine:3.18.0 – это Docker-ΠΎΠ±Ρ€Π°Π· Alpine Linux вСрсии 3.18.0.

🐧 Как ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Alpine Linux Π΄ΠΎ послСднСй вСрсии

Π—Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ WORKDIR ΠΌΡ‹ устанавливаСм Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΠΎ адрСсу /tmp.

Π—Π°Ρ‚Π΅ΠΌ выполняСм shell-ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ touch file для создания пустого Ρ„Π°ΠΉΠ»Π°.

НаконСц, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ CMD ΠΌΡ‹ запускаСм ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ls -lh ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС ΠΎΠ±Ρ€Π°Π·Π° Docker.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π· с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ docker build:

$ docker build --tag simpleimage:latest .

Запустив ΠΎΠ±Ρ€Π°Π· Docker, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² Π²Ρ‹Π²ΠΎΠ΄Π΅, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ root ΠΈ Π³Ρ€ΡƒΠΏΠΏΠ΅ root:

$ docker run --rm simpleimage:latest
total 0
-rw-r--r--    1 root     root           0 May 14 01:30 file

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ наш Dockerfile, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ USER для смСны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° appuser:

$ cat Dockerfile
FROM alpine:3.18.0

WORKDIR /tmp
RUN adduser -D appuser
USER appuser

RUN touch file
CMD ls -lh .

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ создаСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ appuser Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ adduser.

Π‘Π΅Π· ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° USER Π½Π΅ сработаСт, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ смоТСт ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ appuser Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ UID:

unable to find user appuser: no matching entries in passwd file

Запустив ΠΎΠ±Ρ€Π°Π· Docker, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ appuser:

$ docker run --rm simpleimage:latest
total 0
-rw-r--r--    1 appuser       appuser           0 May 14 01:56 file

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° USER ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° appuser, Π΄Π²ΠΈΠΆΠΎΠΊ Docker Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ RUN touch file ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ appuser.

3.3. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° RUN su Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

Одна ΠΈΠ· распространСнных ошибок – ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ su с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ RUN Π² Dockerfile.

Π’ частности, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ вмСсто Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ USER ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° RUN sh для достиТСния Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°:

$ cat Dockerfile
FROM alpine:3.18.0

WORKDIR /tmp

RUN adduser -D appuser
RUN su appuser

RUN touch file
CMD ls -lh .

Бмысл ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹ΡˆΠ΅ Dockerfile Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ RUN su appuser для ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² статус ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ appuser.

ПослС этого, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ, ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ appuser.

Однако ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° su appuser Π½Π΅ сохраняСтся Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²:

$ docker build . -q --tag simpleimage:switch-user-with-s
$ docker run --rm simpleimage:switch-user-with-su
total 0      
-rw-r--r--    1 root     root           0 May 14 04:41 file

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ΠΎΠ±Ρ€Π°Π·Π΅ Docker Π½Π΅ Ρ‚Π°ΠΊ просто, ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ su, Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Docker создаСт ΠΎΠ±Ρ€Π°Π·.

Docker ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΠ΅Ρ€ΠΈΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ docker run ΠΈ docker commit для выполнСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ шага Π² Dockerfile, ΠΏΡ€ΠΈ этом ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ шаг запускаСтся ΠΊΠ°ΠΊ Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, Π° измСнСния Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π½ΠΎΠ²Ρ‹ΠΉ слой.

Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, каТдая Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° RUN запускаСтся Π² Π½ΠΎΠ²ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ΅ ΠΈ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, поэтому запуск su Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π΅ RUN Π½Π΅ ΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ влияния Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ с настройками ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΏΠΎΡ‡Π΅ΠΌΡƒ измСнСния, сдСланныС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ cd ΠΈ export, Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… уровнях.

Однако Ρ‚Π°ΠΊΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, ΠΊΠ°ΠΊ USER, WORKDIR ΠΈ ENV, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ настройки ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… шагов, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ RUN.

Π­Ρ‚ΠΎ позволяСт ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ измСнСния, сдСланныС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ², Π½Π° всСх уровнях.

По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ для измСнСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈΠ»ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ Π² ΠΎΠ±Ρ€Π°Π·Π΅ Docker Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹, Π° Π½Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ su.

Если ΠΌΡ‹ всС ΠΆΠ΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ su для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ смСны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄, Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ – ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ, Π² ΠΎΠΏΡ†ΠΈΡŽ -c ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ su:

$ cat Dockerfile 
FROM alpine:3.18.0 

WORKDIR /tmp 

RUN adduser -D appuser 

RUN su appuser -c 'touch file' 
CMD ls -lh .

Π­Ρ‚ΠΎ обСспСчит запуск ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° touch Docker ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ appuser ΠΏΡ€ΠΈ сборкС ΠΎΠ±Ρ€Π°Π·Π°.

4. Π‘ΠΌΠ΅Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Docker

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Docker ΠΏΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ -user Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ docker run.

НапримСр, запустив ΠΎΠ±Ρ€Π°Π· Alpine Linux ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ whoami, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² соотвСтствии с Dockerfile ΠΎΠ±Ρ€Π°Π·Π°:

$ docker run --rm alpine:latest whoami
root

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ -user, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с гостСвым ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ:

$ docker run --rm --user guest alpine:latest whoami
guest

Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ -user ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ docker exec:

$ docker exec --user guest -it alpine whoami
guest

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π΅ /etc/passwd ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Docker.

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π΅ удастся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² запись ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² Ρ„Π°ΠΉΠ»Π΅ /etc/passwd:

$ docker exec --user unknown -it alpine whoami
unable to find user unknown: no matching entries in passwd file

5. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этом руководствС ΠΌΡ‹ Π²ΠΊΡ€Π°Ρ‚Ρ†Π΅ рассмотрСли ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ управлСния доступом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π³Ρ€ΡƒΠΏΠΏ Π² Linux.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° этапС сборки ΠΎΠ±Ρ€Π°Π·Π° Docker ΠΈ запуска ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

Π‘ΠΌΠ΅Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π½Π° этапС сборки осущСствляСтся просто – с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ USER Π² Dockerfile.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° su нСэффСктивна для смСны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΏΡ€ΠΈ сборкС ΠΎΠ±Ρ€Π°Π·Π° Docker.

НаконСц, ΠΌΡ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° docker run, ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° docker exec ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΎΠΏΡ†ΠΈΡŽ -user для смСны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

см. Ρ‚Π°ΠΊΠΆΠ΅:

 

You may also like

Leave a Comment