Глава 6 · 6.3
Docker и защитната стена: как да публикувате портове безопасно
Това е капанът, в който попадат повечето хора. Порт, който публикувате в Docker с ports:, е достъпен от интернет, дори ако ufw затваря този порт. Docker задава свои собствени правила на защитната стена и те имат предимство пред правилата на ufw.
Пример за това какво се обърква
services:
db:
image: mariadb:11
ports:
- "3306:3306"
Защитната Ви стена показва, че само 22, 80 и 443 са отворени. Въпреки това Вашата база данни вече е достъпна от целия свят на порт 3306.
Три правила, които пазят сигурността
- Публикувайте само това, което трябва да е достъпно отвън. В това ръководство това е само Caddy, на 80 и 443. Приложенията комуникират с Caddy през вътрешната мрежа на compose. Те не се нуждаят от
ports:. - Трябва ли даден порт да е достъпен само на самия сървър? Поставете
127.0.0.1:пред него. Тогава достъп до него има само самият сървър или Вие чрез SSH тунел (вижте SSH config: влизане с кратко име). - Базата данни никога не получава
ports:. Приложението я намира по името на услугата, напримерdb.
ports:
- "127.0.0.1:3001:3001"
Проверка отвън
Проверете на сървъра кои портове са отворени за всички:
anna@web1:~$ sudo ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 4096 0.0.0.0:443 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 4096 127.0.0.1:3001 0.0.0.0:* users:(("docker-proxy",...))
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",...))
Всичко с 0.0.0.0 или [::] е достъпно отвън. Всичко с 127.0.0.1 е достъпно само отвътре. Ако искате да проверите отвън, използвайте от собствения си компютър скенер на портове като nmap срещу Вашия собствен IP адрес.
Внимание: Не свързвайте /var/run/docker.sock в контейнер, освен ако не знаете точно защо. Който поеме контрола над този контейнер, получава с това целия Ви сървър.
