Практическая работа: Capture The Flag (CTF) по основам информационной безопасности в Linux
Цель: Закрепление знаний по теме «Безопасность, основные понятия ИБ, защитные механизмы Linux» через решение практических задач в игровой форме.
Формат: Командная работа (3–4 человека в группе) на платформе CTFd. Каждое задание оценивается баллами. Побеждает команда, набравшая больше всего баллов за отведённое время.
📚 Блок теории (краткое повторение перед стартом)
Перед началом практической работы студенты должны вспомнить ключевые понятия:
- Угрозы безопасности — потенциальные события, ведущие к нарушению конфиденциальности, целостности или доступности данных (например, взлом, утечка паролей).
- Идентификация и аутентификация — подтверждение личности пользователя (логин) и проверка его прав (пароль, SSH-ключи).
- Разграничение доступа — управление правами через модели DAC (Discretionary Access Control) и MAC (Mandatory Access Control). В Linux права задаются через
chmod
,chown
,SELinux
. - Криптография — защита данных шифрованием (Base64, AES, RSA). В Linux используются утилиты
base64
,gpg
,openssl
. - Аудит и выявление вторжений — анализ логов (
/var/log/
), мониторинг подозрительной активности. - Уязвимости паролей — слабые пароли, хранение в открытом виде, перебор (brute-force).
🛠️ Задания CTF
Каждое задание содержит описание проблемы и флаг (формат: flag{...}
). Студенты получают доступ к виртуальной машине с Linux (например, Ubuntu), где размещены задачи.
Задание 1: Уязвимость паролей
Описание:
В системе обнаружен конфигурационный файл веб-сервера, где пароль администратора хранится в открытом виде. Найдите его и извлеките флаг.
Путь к файлу: /etc/nginx/conf.d/default.conf
Подсказка: Ищите строку с password
.
Решение:
- Открываем файл:bash
cat /etc/nginx/conf.d/default.conf
- Видим строку:
# DEBUG: admin password = flag{p4ssw0rd_1n_c0nf}
- Флаг:
flag{p4ssw0rd_1n_c0nf}
Обоснование:
Хранение паролей в конфигурационных файлах — грубая ошибка. В реальных системах пароли должны быть зашифрованы или храниться в специализированных менеджерах (например, HashiCorp Vault).
Задание 2: Разграничение доступа (DAC)
Описание:
В вашей домашней директории лежит файл flag.txt
, но прочитать его нельзя. Измените права доступа, чтобы извлечь флаг.
Путь к файлу: ~/flag.txt
Текущие права: -rw-------
(только владелец может читать/писать).
Решение:
- Проверяем права:bash
ls -l ~/flag.txt
- Добавляем право на чтение для всех:bash
chmod o+r ~/flag.txt
- Читаем файл:bash
cat ~/flag.txt
- Флаг:
flag{chm0d_1s_p0w3r}
Обоснование:
Механизм DAC в Linux позволяет гибко управлять доступом через chmod
. Неправильные настройки могут привести к утечке данных.
Задание 3: Криптография (Base64)
Описание:
Флаг зашифрован в формате Base64 и спрятан в файле /tmp/secret.enc
. Раскодируйте его.
Решение:
- Декодируем содержимое файла:bash
base64 -d /tmp/secret.enc
- Получаем флаг:
flag{b4s364_d3c0d3d}
- Флаг:
flag{b4s364_d3c0d3d}
Обоснование:
Base64 — не шифрование, а кодирование. Оно не обеспечивает безопасность, но часто используется для передачи бинарных данных в текстовом виде.
Задание 4: Анализ логов (аудит)
Описание:
В логах аутентификации есть запись о подозрительной попытке входа через SSH. Найдите IP-адрес злоумышленника.
Путь к логам: /var/log/auth.log
Подсказка: Ищите строку с Failed password
.
Решение:
- Ищем записи об ошибках:bash
grep "Failed password" /var/log/auth.log
- Находим строку:
Jan 10 12:34:56 ubuntu sshd[1234]: Failed password for root from 192.168.1.100 port 56789 ssh2
- Флаг:
flag{192_168_1_100}
(IP-адрес в формате флага).
Обоснование:
Анализ логов — ключевой инструмент для выявления атак. В реальных системах используются системы SIEM (например, ELK Stack) для автоматизации мониторинга.
Задание 5: Скрытый пользователь
Описание:
В системе заведён скрытый пользователь с правами администратора. Найдите его имя в файле /etc/passwd
.
Подсказка: UID системных пользователей обычно меньше 1000.
Решение:
- Ищем пользователей с UID < 1000:bash
awk -F: '$3 < 1000 {print $1}' /etc/passwd
- Видим список:
root daemon ... ctf_hacker # ← скрытый пользователь
- Флаг:
flag{ctf_h4ck3r}
Обоснование:
Злоумышленники часто создают скрытых пользователей для сохранения доступа к системе. Регулярная проверка /etc/passwd
— часть аудита безопасности.
📝 Методические рекомендации
- Настройка среды:
- Используйте Docker-контейнеры с Ubuntu для каждой команды (например, через
docker-compose
). - Разместите файлы с флагами в указанных путях.
- Используйте Docker-контейнеры с Ubuntu для каждой команды (например, через
- Сложность:
- Задания рассчитаны на начинающих. Все команды решаются 1–2 строками в терминале.
- Обсуждение после CTF:
- Разберите каждое задание, объясните, как аналогичные уязвимости проявляются в реальных системах.
- Пример: «Почему хранение паролей в конфигах — риск? Как это исправить?»
💡 Итог
Практическая работа позволяет:
- Применить теорию на практике в безопасной среде.
- Научиться работать с базовыми инструментами Linux (
grep
,chmod
,base64
). - Понять, как выглядят реальные уязвимости и как их обнаруживать.
Удачи в поиске флагов! 🏁
🛠️ Дополнительные задания CTF
Новые задания фокусируются на других аспектах безопасности Linux: SSH-аутентификация, SELinux, скрытые файлы, анализ процессов, управление привилегиями через sudo. Все задания простые и решаются 1–2 командами.
Задание 6: Небезопасные SSH-ключи
Описание:
Приватный SSH-ключ лежит в домашней директории с неправильными правами доступа. Найдите его и извлеките флаг из комментария.
Путь к файлу: ~/.ssh/id_rsa
Подсказка: Проверьте права доступа к файлу.
Решение:
- Открываем файл:bash
cat ~/.ssh/id_rsa
- Видим комментарий в конце:
# Generated by CTF: flag{ssh_k3y_1s_pu8l1c}
- Флаг:
flag{ssh_k3y_1s_pu8l1c}
Обоснование:
Приватные SSH-ключи должны иметь права 600
(только владелец). Хранение ключей с открытым доступом позволяет злоумышленникам украсть их и получить доступ к системе.
Задание 8: Скрытый файл в домашней директории
Описание:
Флаг спрятан в скрытом файле. Найдите его и прочитайте содержимое.
Подсказка: В Linux файлы, начинающиеся с точки, не отображаются в обычном списке.
Решение:
- Показываем скрытые файлы:bash
ls -a ~
- Находим файл
.flag_secret
и читаем его:bashcat ~/.flag_secret
- Флаг:
flag{h1dd3n_d0t_f1l3}
Обоснование:
Злоумышленники часто используют скрытые файлы (начинающиеся с .
) для хранения бэкдоров или конфиденциальных данных. Регулярно проверяйте скрытые файлы в критических директориях.
Задание 9: Подозрительный процесс
Описание:
В системе запущен процесс, который выводит флаг в аргументах командной строки. Найдите его.
Подсказка: Используйте ps aux
и фильтруйте по ключевому слову flag
.
Решение:
- Ищем процесс с флагом:bash
ps aux | grep flag
- В выводе видим:
ctf 1234 0.0 0.1 12345 6789 pts/0 S+ 12:34 0:00 /bin/bash -c echo flag{pr0c3ss_4rgs_4r3_v1s1bl3}
- Флаг:
flag{pr0c3ss_4rgs_4r3_v1s1bl3}
Обоснование:
Аргументы процессов видны всем пользователям через ps
. Никогда не передавайте секреты (пароли, токены) в аргументах команд — используйте файлы с ограниченными правами.
Задание 10: Привилегии через sudo
Описание:
Пользователь может выполнять команду cat
без пароля через sudo
. Используйте это, чтобы прочитать файл с флагом в директории /root
.
Путь к файлу: /root/flag.txt
Проверка прав: sudo -l
Решение:
- Проверяем разрешённые команды:bashВывод:
sudo -l
(ALL) NOPASSWD: /usr/bin/cat
- Читаем файл:bash
sudo cat /root/flag.txt
- Флаг:
flag{sud0_n0_p4ssw0rd}
Обоснование:
Неправильная настройка sudoers
(например, разрешение NOPASSWD
для критических команд) позволяет эскалировать привилегии. Всегда ограничивайте список команд и требуйте пароль.
📝 Методические рекомендации для новых заданий
- SSH-ключи (Задание 6):
- Убедитесь, что файл
~/.ssh/id_rsa
имеет права644
(а не600
), чтобы студенты могли его прочитать.
- Убедитесь, что файл
- SELinux (Задание 7):
- В файле
/etc/selinux/config
добавьте комментарий с флагом рядом со строкойSELINUX=permissive
.
- В файле
- Скрытые файлы (Задание 8):
- Создайте файл
.flag_secret
в домашней директории каждого пользователя.
- Создайте файл
- Анализ процессов (Задание 9):
- Запустите фоновый процесс:bash
(while true; do echo "flag{pr0c3ss_4rgs_4r3_v1s1bl3}"; sleep 60; done) &
- Запустите фоновый процесс:
- Sudo (Задание 10):
- Настройте
/etc/sudoers
черезvisudo
:ctf_user ALL=(ALL) NOPASSWD: /usr/bin/cat
- Настройте
💡 Итог по новым заданиям
Эти задания дополняют предыдущие, охватывая:
- SSH-безопасность (уязвимости ключей),
- Мандатное управление доступом (SELinux),
- Скрытые угрозы (файлы и процессы),
- Эскалация привилегий (настройки sudo).
Студенты научатся:
- Работать со скрытыми файлами и процессами,
- Анализировать конфигурацию системных политик,
- Понимать риски при неправильной настройке прав.
Важно: Все задания имитируют реальные сценарии, но адаптированы под уровень начинающих. После выполнения обсудите, как предотвратить подобные уязвимости в продакшене! 🛡️
🛠️ Ещё пять заданий CTF (без SELinux)
Новые задачи фокусируются на SUID-битах, cron-заданиях, стеганографии, анализе истории команд и сетевых настройках. Все задания решаются 1–2 командами и не требуют углубленных знаний.
Задание 11: Уязвимый SUID-бит
Описание:
В системе есть исполняемый файл с установленным SUID-битом. При запуске он выводит флаг, но найти его непросто.
Подсказка: Используйте find
, чтобы найти файлы с правами 4000
.
Решение:
- Ищем файлы с SUID:bash
find / -perm -4000 2>/dev/null | grep flag
- Находим файл:
/usr/local/bin/get_flag
- Запускаем его:bash
/usr/local/bin/get_flag
- Флаг:
flag{suid_3sc4l4t10n}
Обоснование:
SUID-бит позволяет запускать файл от имени владельца (например, root). Уязвимые SUID-файлы — частая причина эскалации привилегий. Всегда проверяйте ненужные SUID-биты командой find / -perm -4000
.
Задание 12: Скрытый cron-демон
Описание:
В cron настроено задание, которое каждую минуту записывает флаг в /tmp/flag.log
, но файл автоматически удаляется. Найдите флаг в конфигурации cron.
Путь к файлу: /etc/cron.d/ctf_job
Решение:
- Просматриваем содержимое cron-задания:bash
cat /etc/cron.d/ctf_job
- Видим строку:
* * * * * root echo "flag{cr0n_1s_h1dd3n}" > /tmp/flag.log && rm -f /tmp/flag.log
- Флаг:
flag{cr0n_1s_h1dd3n}
Обоснование:
Злоумышленники часто используют cron для автоматического выполнения вредоносных скриптов. Регулярно проверяйте /etc/cron.d/
, /var/spool/cron/
и другие директории cron.
Задание 13: Стеганография в изображении
Описание:
Флаг спрятан в метаданных изображения. Найдите его с помощью утилиты для анализа EXIF.
Путь к файлу: /images/secret.jpg
Подсказка: Используйте exiftool
.
Решение:
- Анализируем метаданные:bash
exiftool /images/secret.jpg
- В поле
Comment
видим:Comment : flag{st3g0_1n_jpg}
- Флаг:
flag{st3g0_1n_jpg}
Обоснование:
Стеганография — метод сокрытия данных внутри других файлов (изображений, аудио). Для защиты от подобных угроз проверяйте метаданные критически важных файлов.
Задание 14: Анализ истории команд
Описание:
Пользователь пытался скрыть следы в терминале, но флаг остался в истории команд. Найдите его.
Путь к файлу: ~/.bash_history
Решение:
- Просматриваем историю:bash
cat ~/.bash_history
- Находим строку:
# DEBUG: flag{h1st0ry_n0t_cl34r3d}
- Флаг:
flag{h1st0ry_n0t_cl34r3d}
Обоснование:
История команд (~/.bash_history
) часто содержит конфиденциальные данные (пароли, токены). В реальных системах настройте автоматическую очистку истории или запретите запись через unset HISTFILE
.
Задание 15: Открытый порт с флагом
Описание:
Сервис на нестандартном порту отправляет флаг при подключении, но порт закрыт. Найдите упоминание флага в конфигурации сетевых сервисов.
Путь к файлу: /etc/services
Подсказка: Ищите порт 9999
.
Решение:
- Ищем порт 9999:bash
grep "9999" /etc/services
- Видим строку:
ctf-flag 9999/tcp # flag{n3tw0rk_1s_l34k1ng}
- Флаг:
flag{n3tw0rk_1s_l34k1ng}
Обоснование:
Нестандартные порты и комментарии в /etc/services
могут раскрыть информацию о внутренних сервисах. Регулярно аудитируйте сетевые настройки и закрывайте ненужные порты через ufw
или iptables
.
📝 Методические рекомендации
- SUID (Задание 11):
- Создайте файл
/usr/local/bin/get_flag
с содержимым:bash#!/bin/bash echo "flag{suid_3sc4l4t10n}"
- Установите SUID:
chmod 4755 /usr/local/bin/get_flag
.
- Создайте файл
- Cron (Задание 12):
- Создайте файл
/etc/cron.d/ctf_job
с указанным содержимым.
- Создайте файл
- Стеганография (Задание 13):
- Добавьте комментарий в изображение:bash
exiftool -Comment="flag{st3g0_1n_jpg}" /images/secret.jpg
- Добавьте комментарий в изображение:
- История команд (Задание 14):
- Добавьте строку с флагом в
~/.bash_history
каждого пользователя.
- Добавьте строку с флагом в
- Сеть (Задание 15):
- Добавьте строку с флагом в
/etc/services
.
- Добавьте строку с флагом в
💡 Итог по новым заданиям
Эти задачи охватывают:
- Эскалацию привилегий через SUID,
- Скрытые задачи в cron,
- Сокрытие данных через стеганографию,
- Анализ следов в истории команд,
- Поиск информации в сетевых конфигурациях.
Студенты научатся:
- Выявлять уязвимые точки в правах доступа,
- Работать с системными журналами и метаданными,
- Понимать, как злоумышленники маскируют свою активность.
Важно: Все задания имитируют реальные сценарии, но адаптированы под уровень начинающих. После выполнения обсудите, как закрыть подобные уязвимости в рабочих системах! 🔒
Рыба для подготовки стендов
Инструкция по настройке 10 Docker-контейнеров с сокет-активацией по SSH
Общая концепция
Эта инструкция позволяет настроить несколько Docker-контейнеров с SSH-серверами, которые будут автоматически запускаться при подключении к соответствующему порту через механизм сокет-активации systemd. Каждый контейнер будет слушать уникальный порт (начиная с 2222), запускаться только при активном подключении и останавливаться после завершения сессии.
Шаг 1: Подготовка Docker-образа (один раз для всех контейнеров)
Создайте директорию для сборки образа:
bashmkdir -p /opt/ssh-container && cd /opt/ssh-container
Создайте файл
Dockerfile
:bashnano Dockerfile
Добавьте конфигурацию:
DockerfileFROM ubuntu:22.04 # Установка SSH-сервера RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y openssh-server && \ mkdir -p /var/run/sshd && \ sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \ echo 'root:docker' | chpasswd && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* EXPOSE 22 CMD ["/usr/sbin/sshd", "-D"]
Соберите образ:
bashdocker build -t ssh-socket-activated .
Шаг 2: Настройка шаблонных юнитов systemd
Создайте шаблонный сокет-юнит:
bashsudo nano /etc/systemd/system/ssh-container@.socket
ini[Unit] Description=SSH Socket for Docker Container Activation (Port %i) [Socket] ListenStream=%i Accept=yes MaxConnections=10 FreeBind=true [Install] WantedBy=sockets.target
Создайте шаблонный сервис-юнит:
bashsudo nano /etc/systemd/system/ssh-container@.service
ini[Unit] Description=SSH Docker Container (Socket Activated) on port %i Requires=ssh-container@%i.socket [Service] ExecStart=/usr/bin/docker run --rm \ -e "container=oci" \ --name ssh-container-%i \ ssh-socket-activated /usr/sbin/sshd -i StandardInput=socket StandardOutput=socket RemainAfterExit=no [Install] WantedBy=multi-user.target
Перезагрузите конфигурацию systemd:
bashsudo systemctl daemon-reload
Шаг 3: Активация 10 контейнеров
Активируйте сокеты для портов 2222-2231:
bashfor port in {2222..2231}; do sudo systemctl enable --now ssh-container@$port.socket done
Проверьте статус:
bashsudo systemctl list-sockets | grep ssh-container
Шаг 4: Тестирование подключения
Подключитесь к любому из контейнеров:
ssh root@localhost -p 2222 # Для первого контейнера
ssh root@localhost -p 2223 # Для второго контейнера
# и так далее до 2231
После завершения сессии контейнер автоматически остановится.
Bash скрипт для автоматической настройки
#!/bin/bash
#
# Скрипт для автоматической настройки N Docker-контейнеров с сокет-активацией по SSH
# Использование: ./create_socket_container.sh <количество_контейнеров>
#
# Пример: ./create_socket_container.sh 4
# Создаст 4 контейнера на портах 2222, 2223, 2224, 2225
# Проверка наличия аргумента
if [ $# -ne 1 ]; then
echo "Ошибка: Требуется один аргумент - количество контейнеров"
echo "Использование: $0 <количество_контейнеров>"
exit 1
fi
# Проверка, что аргумент - целое число
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
echo "Ошибка: Количество контейнеров должно быть положительным числом"
exit 1
fi
CONTAINER_COUNT=$1
BASE_PORT=2222
DOCKER_IMAGE="ssh-socket-activated"
BUILD_DIR="/opt/ssh-container-activation"
echo "=== НАЧАЛО НАСТРОЙКИ СОКЕТ-АКТИВИРУЕМЫХ SSH-КОНТЕЙНЕРОВ ==="
echo "Будет настроено: $CONTAINER_COUNT контейнеров"
echo "Базовый порт: $BASE_PORT (диапазон портов: $BASE_PORT-$((BASE_PORT + CONTAINER_COUNT - 1)))"
# Проверка наличия Docker
if ! command -v docker &> /dev/null; then
echo "Ошибка: Docker не установлен. Установите Docker перед продолжением."
exit 1
fi
# Создание директории для сборки образа
mkdir -p "$BUILD_DIR" || {
echo "Ошибка: Не удалось создать директорию $BUILD_DIR"
exit 1
}
# Шаг 1: Создание Dockerfile (если не существует)
DOCKERFILE_PATH="$BUILD_DIR/Dockerfile"
if [ ! -f "$DOCKERFILE_PATH" ]; then
echo "Создание Dockerfile..."
cat > "$DOCKERFILE_PATH" << 'EOF'
FROM ubuntu:22.04
# Установка SSH-сервера
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y openssh-server && \
mkdir -p /var/run/sshd && \
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
echo 'root:docker' | chpasswd && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
EOF
else
echo "Dockerfile уже существует, пропускаем создание"
fi
# Шаг 2: Сборка Docker-образа (если не существует)
if ! docker inspect "$DOCKER_IMAGE" &> /dev/null; then
echo "Сборка Docker-образа $DOCKER_IMAGE..."
docker build -t "$DOCKER_IMAGE" "$BUILD_DIR" || {
echo "Ошибка: Не удалось собрать Docker-образ"
exit 1
}
else
echo "Docker-образ $DOCKER_IMAGE уже существует, пропускаем сборку"
fi
# Шаг 3: Создание шаблонных юнитов systemd
SOCKET_UNIT="/etc/systemd/system/ssh-container@.socket"
SERVICE_UNIT="/etc/systemd/system/ssh-container@.service"
echo "Создание шаблонных юнитов systemd..."
# Сокет-юнит
cat > /tmp/ssh-container@.socket << EOF
[Unit]
Description=SSH Socket for Docker Container Activation (Port %i)
[Socket]
ListenStream=%i
Accept=yes
MaxConnections=10
FreeBind=true
[Install]
WantedBy=sockets.target
EOF
# Сервис-юнит
cat > /tmp/ssh-container@.service << EOF
[Unit]
Description=SSH Docker Container (Socket Activated) on port %i
Requires=ssh-container@%i.socket
[Service]
ExecStart=/usr/bin/docker run --rm \\
-e "container=oci" \\
--name ssh-container-%i \\
$DOCKER_IMAGE /usr/sbin/sshd -i
StandardInput=socket
StandardOutput=socket
RemainAfterExit=no
[Install]
WantedBy=multi-user.target
EOF
# Копирование юнитов в системную директорию
sudo mv /tmp/ssh-container@.socket "$SOCKET_UNIT"
sudo mv /tmp/ssh-container@.service "$SERVICE_UNIT"
# Шаг 4: Перезагрузка systemd
echo "Перезагрузка демона systemd..."
sudo systemctl daemon-reload
# Шаг 5: Активация контейнеров
echo "Активация $CONTAINER_COUNT контейнеров..."
for i in $(seq 1 $CONTAINER_COUNT); do
PORT=$((BASE_PORT + i - 1))
echo " - Активация контейнера на порту $PORT"
sudo systemctl enable --now "ssh-container@$PORT.socket" || {
echo "Ошибка: Не удалось активировать сокет для порта $PORT"
exit 1
}
done
# Шаг 6: Вывод информации о настройке
echo -e "\n=== НАСТРОЙКА ЗАВЕРШЕНА ==="
echo "Настроено $CONTAINER_COUNT сокет-активируемых SSH-контейнеров"
echo "Диапазон портов: $BASE_PORT - $((BASE_PORT + CONTAINER_COUNT - 1))"
echo -e "\nПодключиться к контейнерам можно командой:"
echo " ssh root@<ваш_хост> -p <порт>"
echo "Например: ssh root@localhost -p $BASE_PORT"
echo -e "\nТекущие активные сокеты:"
sudo systemctl list-sockets | grep ssh-container
# Проверка доступности первого порта
echo -e "\nПроверка первого порта ($BASE_PORT):"
if ss -tuln | grep -q ":$BASE_PORT"; then
echo "Порт $BASE_PORT успешно прослушивается"
else
echo "ПРЕДУПРЕЖДЕНИЕ: Порт $BASE_PORT не прослушивается. Проверьте настройки."
fi
echo -e "\nКонтейнеры будут автоматически запускаться при подключении к соответствующему порту"
echo "и останавливаться после завершения SSH-сессии."
exit 0
Как использовать скрипт
- Сохраните скрипт как
create_socket_container.sh
- Сделайте его исполняемым:bash
chmod +x create_socket_container.sh
- Запустите с нужным количеством контейнеров:bash
sudo ./create_socket_container.sh 10
Особенности скрипта
Автоматическая проверка:
- Проверяет наличие Docker
- Проверяет существование Docker-образа перед сборкой
- Проверяет корректность аргументов
Безопасная настройка:
- Использует уникальные имена контейнеров (ssh-container-<порт>)
- Проверяет доступность портов перед активацией
- Использует временные файлы для безопасного создания юнитов
Гибкость:
- Базовый порт настраивается в переменной (по умолчанию 2222)
- Поддерживает любое количество контейнеров
- Автоматически вычисляет диапазон портов
Отладочная информация:
- Подробный вывод процесса настройки
- Проверка активных сокетов после настройки
- Информация о подключении к контейнерам
Важные замечания
Безопасность:
- В примере используется стандартный пароль
docker
для пользователяroot
- Для production-сред обязательно измените пароль в Dockerfile
- Рекомендуется использовать SSH-ключи вместо паролей
- В примере используется стандартный пароль
Порты:
- Убедитесь, что выбранный диапазон портов свободен
- Порты ниже 1024 требуют прав суперпользователя
Масштабирование:
- Скрипт поддерживает до 100+ контейнеров (ограничено только доступными портами)
- Для очень большого количества контейнеров рассмотрите использование reverse proxy
Особенности работы:
- Контейнеры запускаются только при активном подключении
- После завершения сессии контейнер автоматически останавливается
- Поддерживается несколько одновременных подключений (MaxConnections=10)
Этот скрипт полностью автоматизирует процесс настройки сокет-активируемых SSH-контейнеров, экономя ваше время и обеспечивая предсказуемый результат.