Skip to content

Практическая работа: Capture The Flag (CTF) по основам информационной безопасности в Linux

Цель: Закрепление знаний по теме «Безопасность, основные понятия ИБ, защитные механизмы Linux» через решение практических задач в игровой форме.
Формат: Командная работа (3–4 человека в группе) на платформе CTFd. Каждое задание оценивается баллами. Побеждает команда, набравшая больше всего баллов за отведённое время.


📚 Блок теории (краткое повторение перед стартом)

Перед началом практической работы студенты должны вспомнить ключевые понятия:

  1. Угрозы безопасности — потенциальные события, ведущие к нарушению конфиденциальности, целостности или доступности данных (например, взлом, утечка паролей).
  2. Идентификация и аутентификация — подтверждение личности пользователя (логин) и проверка его прав (пароль, SSH-ключи).
  3. Разграничение доступа — управление правами через модели DAC (Discretionary Access Control) и MAC (Mandatory Access Control). В Linux права задаются через chmod, chown, SELinux.
  4. Криптография — защита данных шифрованием (Base64, AES, RSA). В Linux используются утилиты base64, gpg, openssl.
  5. Аудит и выявление вторжений — анализ логов (/var/log/), мониторинг подозрительной активности.
  6. Уязвимости паролей — слабые пароли, хранение в открытом виде, перебор (brute-force).

🛠️ Задания CTF

Каждое задание содержит описание проблемы и флаг (формат: flag{...}). Студенты получают доступ к виртуальной машине с Linux (например, Ubuntu), где размещены задачи.


Задание 1: Уязвимость паролей

Описание:
В системе обнаружен конфигурационный файл веб-сервера, где пароль администратора хранится в открытом виде. Найдите его и извлеките флаг.
Путь к файлу: /etc/nginx/conf.d/default.conf
Подсказка: Ищите строку с password.

Решение:

  1. Открываем файл:
    bash
    cat /etc/nginx/conf.d/default.conf
  2. Видим строку:
    # DEBUG: admin password = flag{p4ssw0rd_1n_c0nf}
  3. Флаг: flag{p4ssw0rd_1n_c0nf}

Обоснование:
Хранение паролей в конфигурационных файлах — грубая ошибка. В реальных системах пароли должны быть зашифрованы или храниться в специализированных менеджерах (например, HashiCorp Vault).


Задание 2: Разграничение доступа (DAC)

Описание:
В вашей домашней директории лежит файл flag.txt, но прочитать его нельзя. Измените права доступа, чтобы извлечь флаг.
Путь к файлу: ~/flag.txt
Текущие права: -rw------- (только владелец может читать/писать).

Решение:

  1. Проверяем права:
    bash
    ls -l ~/flag.txt
  2. Добавляем право на чтение для всех:
    bash
    chmod o+r ~/flag.txt
  3. Читаем файл:
    bash
    cat ~/flag.txt
  4. Флаг: flag{chm0d_1s_p0w3r}

Обоснование:
Механизм DAC в Linux позволяет гибко управлять доступом через chmod. Неправильные настройки могут привести к утечке данных.


Задание 3: Криптография (Base64)

Описание:
Флаг зашифрован в формате Base64 и спрятан в файле /tmp/secret.enc. Раскодируйте его.

Решение:

  1. Декодируем содержимое файла:
    bash
    base64 -d /tmp/secret.enc
  2. Получаем флаг: flag{b4s364_d3c0d3d}
  3. Флаг: flag{b4s364_d3c0d3d}

Обоснование:
Base64 — не шифрование, а кодирование. Оно не обеспечивает безопасность, но часто используется для передачи бинарных данных в текстовом виде.


Задание 4: Анализ логов (аудит)

Описание:
В логах аутентификации есть запись о подозрительной попытке входа через SSH. Найдите IP-адрес злоумышленника.
Путь к логам: /var/log/auth.log
Подсказка: Ищите строку с Failed password.

Решение:

  1. Ищем записи об ошибках:
    bash
    grep "Failed password" /var/log/auth.log
  2. Находим строку:
    Jan 10 12:34:56 ubuntu sshd[1234]: Failed password for root from 192.168.1.100 port 56789 ssh2
  3. Флаг: flag{192_168_1_100} (IP-адрес в формате флага).

Обоснование:
Анализ логов — ключевой инструмент для выявления атак. В реальных системах используются системы SIEM (например, ELK Stack) для автоматизации мониторинга.


Задание 5: Скрытый пользователь

Описание:
В системе заведён скрытый пользователь с правами администратора. Найдите его имя в файле /etc/passwd.
Подсказка: UID системных пользователей обычно меньше 1000.

Решение:

  1. Ищем пользователей с UID < 1000:
    bash
    awk -F: '$3 < 1000 {print $1}' /etc/passwd
  2. Видим список:
    root  
    daemon  
    ...  
    ctf_hacker  # ← скрытый пользователь
  3. Флаг: flag{ctf_h4ck3r}

Обоснование:
Злоумышленники часто создают скрытых пользователей для сохранения доступа к системе. Регулярная проверка /etc/passwd — часть аудита безопасности.


📝 Методические рекомендации

  1. Настройка среды:
    • Используйте Docker-контейнеры с Ubuntu для каждой команды (например, через docker-compose).
    • Разместите файлы с флагами в указанных путях.
  2. Сложность:
    • Задания рассчитаны на начинающих. Все команды решаются 1–2 строками в терминале.
  3. Обсуждение после CTF:
    • Разберите каждое задание, объясните, как аналогичные уязвимости проявляются в реальных системах.
    • Пример: «Почему хранение паролей в конфигах — риск? Как это исправить?»

💡 Итог

Практическая работа позволяет:

  • Применить теорию на практике в безопасной среде.
  • Научиться работать с базовыми инструментами Linux (grep, chmod, base64).
  • Понять, как выглядят реальные уязвимости и как их обнаруживать.

Удачи в поиске флагов! 🏁

🛠️ Дополнительные задания CTF

Новые задания фокусируются на других аспектах безопасности Linux: SSH-аутентификация, SELinux, скрытые файлы, анализ процессов, управление привилегиями через sudo. Все задания простые и решаются 1–2 командами.


Задание 6: Небезопасные SSH-ключи

Описание:
Приватный SSH-ключ лежит в домашней директории с неправильными правами доступа. Найдите его и извлеките флаг из комментария.
Путь к файлу: ~/.ssh/id_rsa
Подсказка: Проверьте права доступа к файлу.

Решение:

  1. Открываем файл:
    bash
    cat ~/.ssh/id_rsa
  2. Видим комментарий в конце:
    # Generated by CTF: flag{ssh_k3y_1s_pu8l1c}
  3. Флаг: flag{ssh_k3y_1s_pu8l1c}

Обоснование:
Приватные SSH-ключи должны иметь права 600 (только владелец). Хранение ключей с открытым доступом позволяет злоумышленникам украсть их и получить доступ к системе.


Задание 8: Скрытый файл в домашней директории

Описание:
Флаг спрятан в скрытом файле. Найдите его и прочитайте содержимое.
Подсказка: В Linux файлы, начинающиеся с точки, не отображаются в обычном списке.

Решение:

  1. Показываем скрытые файлы:
    bash
    ls -a ~
  2. Находим файл .flag_secret и читаем его:
    bash
    cat ~/.flag_secret
  3. Флаг: flag{h1dd3n_d0t_f1l3}

Обоснование:
Злоумышленники часто используют скрытые файлы (начинающиеся с .) для хранения бэкдоров или конфиденциальных данных. Регулярно проверяйте скрытые файлы в критических директориях.


Задание 9: Подозрительный процесс

Описание:
В системе запущен процесс, который выводит флаг в аргументах командной строки. Найдите его.
Подсказка: Используйте ps aux и фильтруйте по ключевому слову flag.

Решение:

  1. Ищем процесс с флагом:
    bash
    ps aux | grep flag
  2. В выводе видим:
    ctf 1234 0.0 0.1 12345 6789 pts/0 S+ 12:34 0:00 /bin/bash -c echo flag{pr0c3ss_4rgs_4r3_v1s1bl3}
  3. Флаг: flag{pr0c3ss_4rgs_4r3_v1s1bl3}

Обоснование:
Аргументы процессов видны всем пользователям через ps. Никогда не передавайте секреты (пароли, токены) в аргументах команд — используйте файлы с ограниченными правами.


Задание 10: Привилегии через sudo

Описание:
Пользователь может выполнять команду cat без пароля через sudo. Используйте это, чтобы прочитать файл с флагом в директории /root.
Путь к файлу: /root/flag.txt
Проверка прав: sudo -l

Решение:

  1. Проверяем разрешённые команды:
    bash
    sudo -l
    Вывод: (ALL) NOPASSWD: /usr/bin/cat
  2. Читаем файл:
    bash
    sudo cat /root/flag.txt
  3. Флаг: flag{sud0_n0_p4ssw0rd}

Обоснование:
Неправильная настройка sudoers (например, разрешение NOPASSWD для критических команд) позволяет эскалировать привилегии. Всегда ограничивайте список команд и требуйте пароль.


📝 Методические рекомендации для новых заданий

  1. SSH-ключи (Задание 6):
    • Убедитесь, что файл ~/.ssh/id_rsa имеет права 644 (а не 600), чтобы студенты могли его прочитать.
  2. SELinux (Задание 7):
    • В файле /etc/selinux/config добавьте комментарий с флагом рядом со строкой SELINUX=permissive.
  3. Скрытые файлы (Задание 8):
    • Создайте файл .flag_secret в домашней директории каждого пользователя.
  4. Анализ процессов (Задание 9):
    • Запустите фоновый процесс:
      bash
      (while true; do echo "flag{pr0c3ss_4rgs_4r3_v1s1bl3}"; sleep 60; done) &
  5. 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.

Решение:

  1. Ищем файлы с SUID:
    bash
    find / -perm -4000 2>/dev/null | grep flag
  2. Находим файл: /usr/local/bin/get_flag
  3. Запускаем его:
    bash
    /usr/local/bin/get_flag
  4. Флаг: flag{suid_3sc4l4t10n}

Обоснование:
SUID-бит позволяет запускать файл от имени владельца (например, root). Уязвимые SUID-файлы — частая причина эскалации привилегий. Всегда проверяйте ненужные SUID-биты командой find / -perm -4000.


Задание 12: Скрытый cron-демон

Описание:
В cron настроено задание, которое каждую минуту записывает флаг в /tmp/flag.log, но файл автоматически удаляется. Найдите флаг в конфигурации cron.
Путь к файлу: /etc/cron.d/ctf_job

Решение:

  1. Просматриваем содержимое cron-задания:
    bash
    cat /etc/cron.d/ctf_job
  2. Видим строку:
    * * * * * root echo "flag{cr0n_1s_h1dd3n}" > /tmp/flag.log && rm -f /tmp/flag.log
  3. Флаг: flag{cr0n_1s_h1dd3n}

Обоснование:
Злоумышленники часто используют cron для автоматического выполнения вредоносных скриптов. Регулярно проверяйте /etc/cron.d/, /var/spool/cron/ и другие директории cron.


Задание 13: Стеганография в изображении

Описание:
Флаг спрятан в метаданных изображения. Найдите его с помощью утилиты для анализа EXIF.
Путь к файлу: /images/secret.jpg
Подсказка: Используйте exiftool.

Решение:

  1. Анализируем метаданные:
    bash
    exiftool /images/secret.jpg
  2. В поле Comment видим:
    Comment : flag{st3g0_1n_jpg}
  3. Флаг: flag{st3g0_1n_jpg}

Обоснование:
Стеганография — метод сокрытия данных внутри других файлов (изображений, аудио). Для защиты от подобных угроз проверяйте метаданные критически важных файлов.


Задание 14: Анализ истории команд

Описание:
Пользователь пытался скрыть следы в терминале, но флаг остался в истории команд. Найдите его.
Путь к файлу: ~/.bash_history

Решение:

  1. Просматриваем историю:
    bash
    cat ~/.bash_history
  2. Находим строку:
    # DEBUG: flag{h1st0ry_n0t_cl34r3d}
  3. Флаг: flag{h1st0ry_n0t_cl34r3d}

Обоснование:
История команд (~/.bash_history) часто содержит конфиденциальные данные (пароли, токены). В реальных системах настройте автоматическую очистку истории или запретите запись через unset HISTFILE.


Задание 15: Открытый порт с флагом

Описание:
Сервис на нестандартном порту отправляет флаг при подключении, но порт закрыт. Найдите упоминание флага в конфигурации сетевых сервисов.
Путь к файлу: /etc/services
Подсказка: Ищите порт 9999.

Решение:

  1. Ищем порт 9999:
    bash
    grep "9999" /etc/services
  2. Видим строку:
    ctf-flag 9999/tcp # flag{n3tw0rk_1s_l34k1ng}
  3. Флаг: flag{n3tw0rk_1s_l34k1ng}

Обоснование:
Нестандартные порты и комментарии в /etc/services могут раскрыть информацию о внутренних сервисах. Регулярно аудитируйте сетевые настройки и закрывайте ненужные порты через ufw или iptables.


📝 Методические рекомендации

  1. SUID (Задание 11):
    • Создайте файл /usr/local/bin/get_flag с содержимым:
      bash
      #!/bin/bash
      echo "flag{suid_3sc4l4t10n}"
    • Установите SUID: chmod 4755 /usr/local/bin/get_flag.
  2. Cron (Задание 12):
    • Создайте файл /etc/cron.d/ctf_job с указанным содержимым.
  3. Стеганография (Задание 13):
    • Добавьте комментарий в изображение:
      bash
      exiftool -Comment="flag{st3g0_1n_jpg}" /images/secret.jpg
  4. История команд (Задание 14):
    • Добавьте строку с флагом в ~/.bash_history каждого пользователя.
  5. Сеть (Задание 15):
    • Добавьте строку с флагом в /etc/services.

💡 Итог по новым заданиям

Эти задачи охватывают:

  • Эскалацию привилегий через SUID,
  • Скрытые задачи в cron,
  • Сокрытие данных через стеганографию,
  • Анализ следов в истории команд,
  • Поиск информации в сетевых конфигурациях.

Студенты научатся:

  • Выявлять уязвимые точки в правах доступа,
  • Работать с системными журналами и метаданными,
  • Понимать, как злоумышленники маскируют свою активность.

Важно: Все задания имитируют реальные сценарии, но адаптированы под уровень начинающих. После выполнения обсудите, как закрыть подобные уязвимости в рабочих системах! 🔒

Рыба для подготовки стендов

Инструкция по настройке 10 Docker-контейнеров с сокет-активацией по SSH

Общая концепция

Эта инструкция позволяет настроить несколько Docker-контейнеров с SSH-серверами, которые будут автоматически запускаться при подключении к соответствующему порту через механизм сокет-активации systemd. Каждый контейнер будет слушать уникальный порт (начиная с 2222), запускаться только при активном подключении и останавливаться после завершения сессии.

Шаг 1: Подготовка Docker-образа (один раз для всех контейнеров)

  1. Создайте директорию для сборки образа:

    bash
    mkdir -p /opt/ssh-container && cd /opt/ssh-container
  2. Создайте файл Dockerfile:

    bash
    nano Dockerfile
  3. Добавьте конфигурацию:

    Dockerfile
    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"]
  4. Соберите образ:

    bash
    docker build -t ssh-socket-activated .

Шаг 2: Настройка шаблонных юнитов systemd

  1. Создайте шаблонный сокет-юнит:

    bash
    sudo 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
  2. Создайте шаблонный сервис-юнит:

    bash
    sudo 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
  3. Перезагрузите конфигурацию systemd:

    bash
    sudo systemctl daemon-reload

Шаг 3: Активация 10 контейнеров

  1. Активируйте сокеты для портов 2222-2231:

    bash
    for port in {2222..2231}; do
      sudo systemctl enable --now ssh-container@$port.socket
    done
  2. Проверьте статус:

    bash
    sudo systemctl list-sockets | grep ssh-container

Шаг 4: Тестирование подключения

Подключитесь к любому из контейнеров:

bash
ssh root@localhost -p 2222  # Для первого контейнера
ssh root@localhost -p 2223  # Для второго контейнера
# и так далее до 2231

После завершения сессии контейнер автоматически остановится.


Bash скрипт для автоматической настройки

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

Как использовать скрипт

  1. Сохраните скрипт как create_socket_container.sh
  2. Сделайте его исполняемым:
    bash
    chmod +x create_socket_container.sh
  3. Запустите с нужным количеством контейнеров:
    bash
    sudo ./create_socket_container.sh 10

Особенности скрипта

  1. Автоматическая проверка:

    • Проверяет наличие Docker
    • Проверяет существование Docker-образа перед сборкой
    • Проверяет корректность аргументов
  2. Безопасная настройка:

    • Использует уникальные имена контейнеров (ssh-container-<порт>)
    • Проверяет доступность портов перед активацией
    • Использует временные файлы для безопасного создания юнитов
  3. Гибкость:

    • Базовый порт настраивается в переменной (по умолчанию 2222)
    • Поддерживает любое количество контейнеров
    • Автоматически вычисляет диапазон портов
  4. Отладочная информация:

    • Подробный вывод процесса настройки
    • Проверка активных сокетов после настройки
    • Информация о подключении к контейнерам

Важные замечания

  1. Безопасность:

    • В примере используется стандартный пароль docker для пользователя root
    • Для production-сред обязательно измените пароль в Dockerfile
    • Рекомендуется использовать SSH-ключи вместо паролей
  2. Порты:

    • Убедитесь, что выбранный диапазон портов свободен
    • Порты ниже 1024 требуют прав суперпользователя
  3. Масштабирование:

    • Скрипт поддерживает до 100+ контейнеров (ограничено только доступными портами)
    • Для очень большого количества контейнеров рассмотрите использование reverse proxy
  4. Особенности работы:

    • Контейнеры запускаются только при активном подключении
    • После завершения сессии контейнер автоматически останавливается
    • Поддерживается несколько одновременных подключений (MaxConnections=10)

Этот скрипт полностью автоматизирует процесс настройки сокет-активируемых SSH-контейнеров, экономя ваше время и обеспечивая предсказуемый результат.

Контакты: bystrovno@basealt.ru