#set text(size: 1.3em) #set page(footer: context { if counter(page).get().first() > 1 [ #align(center)[ #counter(page).display("1") ] ] }) #show raw.where(block: false): box.with( fill: luma(240), inset: (x: 3pt, y: 0pt), outset: (y: 3pt), radius: 2pt, ) #show raw.where(block: true): block.with( fill: luma(240), inset: 10pt, radius: 4pt, ) // title #align(center)[Санкт-Петербургский национальный исследовательский университет информационных технологий, механики и оптики] \ \ \ #align(center)[Факультет инфокоммуникационных технологий] #align(center)[Направление подготовки 11.03.02] \ \ #align(center)[Лабораторная работа №4] #align(center)[Элементы безопасности в Linux] \ \ \ //#align(center)[Вариант 19] \ \ \ \ \ \ \ #align(right)[Выполнил:] #align(right)[Дощенников Никита Андреевич] #align(right)[Группа: К3221] #align(right)[Проверил:] #align(right)[Береснев Артем Дмитриевич] \ \ #align(center)[Санкт-Петербург] #align(center)[2025] #pagebreak() === Цель работы: Получить практические навыки работы с сетевой подсистемой в Linux, научится управлять пользователями, правами на файлы и каталоги, научиться настраивать сетевые интерфейсы, NAT и настраивать ssh. === Часть 1. Подготовка конфигурации. У себя на машине я создал новую виртуальную сеть: ```bash virsh net-define /tmp/intnet.xml virsh net-autostart intnet virsh net-start intnet ``` Содержание файла `/tmp/intnet.xml`: ```xml intnet ``` К первой машине я добавил дополнительный интерфейс, подключенный к сети intnet: ```bash virsh attach-interface --domain ubuntu24.04 --type network --source intnet --model virtio --config --live ``` Вторую машину я полностью перевел во внутреннюю сеть: ```bash virsh detach-interface --domain ubuntu24.04-clone --type network --mac 52:54:00:76:1f:db --config --live virsh attach-interface --domain ubuntu24.04-clone --type network --source intnet --model virtio --config --live ``` #align(center)[#image("assets/1.png")] #align(center)[#image("assets/2.png")] На `c7-1`: #align(center)[#image("assets/3.png")] #align(center)[#image("assets/5.png")] #align(center)[#image("assets/6.png")] #align(center)[#image("assets/8.png")] На `c7-2`: #align(center)[#image("assets/4.png")] #align(center)[#image("assets/7.png")] #align(center)[#image("assets/9.png")] === Часть 2. Создание пользователей и настройка OpenSSH Server (sshd). Я создал пользователя на каждой машине: #align(center)[#image("assets/10.png")] #align(center)[#image("assets/11.png")] Затем я настроил `ssh` на обеих машинах: #align(center)[#image("assets/12.png")] И перезапустил daemon: #align(center)[#image("assets/13.png")] Все те же действия я проделал на второй машине. Попробовал подключиться с `c7-1` на `c7-2`: #align(center)[#image("assets/14.png")] === Часть 3. Подключение к виртуальной машине c7-1 по ssh через NAT VirtualBox. У себя на машине: #align(center)[#image("assets/15.png")] #align(center)[#image("assets/16.png")] #align(center)[#image("assets/17.png")] Копирование файла с `c7-2` на `c7-1`: #align(center)[#image("assets/18.png")] Копирование с `c7-2` на `c7-1`: #align(center)[#image("assets/19.png")] === Часть 4. Установка и настройка NAT в iptables. Я установил `iptables`: #align(center)[#image("assets/20.png")] Настроил клиентский NAT, то есть настроил связь между `10.0.0.0/24` и `enp1s0` через роутер `c7-1`. #align(center)[#image("assets/21.png")] Затем я разрешил форвардинг трафика на `c7-1`: #align(center)[#image("assets/22.png")] После этого я проверил работу интернета с `c7-2`: #align(center)[#image("assets/23.png")] Я настроил проброс порта: #align(center)[#image("assets/24.png")] На `c7-1`: #align(center)[#image("assets/25.png")] Локально: #align(center)[#image("assets/26.png")] Текущие правила: #align(center)[#image("assets/27.png")] Настройки не сбрасываются после перезагрузки: #align(center)[#image("assets/28.png")] === Часть 5. Настройка прав на файлы и каталоги. Я создал скрипт `mkuser.sh`: ```bash #!/usr/bin/env bash set -euo pipefail count="${1:?}" start="${2:?}" for ((i=0;i/dev/null 2>&1 || adduser --disabled-password --gecos "" "$u" echo "${u}:${p}" | chpasswd done ``` #align(center)[#image("assets/29.png")] #align(center)[#image("assets/30.png")] Затем я создал группу: #align(center)[#image("assets/31.png")] Членам группы я выдал полный доступ, а остальным только чтение: #align(center)[#image("assets/32.png")] #align(center)[#image("assets/33.png")] Проверим: #align(center)[#image("assets/34.png")] Я сделал так, чтобы в `/DATA/sec1` любой мог писать, но удалять - только свои файлы: #align(center)[#image("assets/35.png")] Проверим: #align(center)[#image("assets/36.png")] `/DATA/sec2` настроен на полный доступ для спец. пользователя, для пользователей `uN` только чтение, для прочих нельзя. #align(center)[#image("assets/37.png")] Проверим: #align(center)[#image("assets/38.png")] В `/DATA/sec3` скопировал `nano` и любой пользователь смог изменять с помощью его файлы в нем. #align(center)[#image("assets/39.png")] Проверим: #align(center)[#image("assets/40.png")] #align(center)[#image("assets/41.png")] Права: #align(center)[#image("assets/42.png")] === Часть 6. Настройка аутентификации по ключу. Локально я создал пару ssh ключей: #align(center)[#image("assets/43.png")] Я передал его на `c7-2`: #align(center)[#image("assets/44.png")] И теперь могу заходить без пароля: #align(center)[#image("assets/45.png")] И скопировал файл к себе на компьютер: #align(center)[#image("assets/46.png")] === Часть 7. Sudo. Я установил `sudo` на `c7-1`: #align(center)[#image("assets/47.png")] Разрешил пользователю из части 2 п.1 повышать привелегии до root. #align(center)[#image("assets/48.png")] Ограничил права первого из созданных в части 5 пользователей: #align(center)[#image("assets/49.png")] #align(center)[#image("assets/50.png")] Проверил работу прав: #align(center)[#image("assets/51.png")] #align(center)[#image("assets/52.png")] #align(center)[#image("assets/53.png")] === Часть 8. Получение информации о пользователях. Я вывел входы пользователей в систему за текущий месяц: #align(center)[#image("assets/54.png")] Вывел информацию о пользователе из части 2 п. 1: #align(center)[#image("assets/55.png")] === Ответы на вопросы. *В части 4 вы использовали готовые команды для настройки NAT. Поясните какие параметры передаются в ключах команды iptables.* Пример команды: ```bash iptables -t nat -A POSTROUTING -o enp1s0 -s 10.0.0.0/24 -j MASQUERADE ``` - `-t nat` — выбрать таблицу NAT; - `-A POSTROUTING` — добавить правило в цепочку POSTROUTING; - `-o enp1s0` — указывает выходной интерфейс; - `-s 10.0.0.0/24` — диапазон внутренних адресов, для которых применяется правило; - `-j MASQUERADE` — действие: подменить IP-адрес источника на внешний адрес интерфейса. Аналогично, при `-j SNAT --to-source ` адрес подменяется на указанный вручную. *При создании ключей ssh программа-генератор предлагает ввести пароль. Зачем он нужен и для чего используется?* Пароль защищает приватный ключ. Даже если файл ключа попадёт в чужие руки, без пароля им нельзя воспользоваться. Это как двойная защита: пароль → разблокирует закрытый ключ, ключ → разблокирует доступ по SSH. *При первом подключении по ssh к новому серверу вам выводится хэш и программа предлагает принять его или отклонить. Зачем это нужно?* Это fingerprint публичного ключа сервера. Он нужен, чтобы убедиться, что ты подключаешься к правильному серверу, а не к подменённому. После подтверждения отпечаток сохраняется в `~/.ssh/known_hosts`. Если при следующем подключении хэш изменился — SSH предупредит о возможной подмене. *Как на сервере ssh определить сколько подключений по ssh есть и от каких пользователей?* Можно посмотреть процессы: ```bash ss -tuna | grep ':22' ``` или более конкретно: ```bash who ``` или: ```bash ps aux | grep sshd ``` `sshd` показывает каждое активное соединение, `who` — кто вошёл в систему, с каких IP-адресов, и сколько пользователей сейчас в системе. *Если у двух пользователей в Linux будут одинаковые пароли, то сможем ли мы понять это по данным в файле `/etc/shadow`? Почему?* Нет. Файл `/etc/shadow` хранит хэши паролей с солью, то есть у каждого пароля добавляется случайное значение перед хэшированием. Даже если два пользователя используют одинаковый пароль, их хэши будут разными. Это сделано специально, чтобы невозможно было определить совпадение паролей. *Заполните таблицу, описывающую действие различных атрибутов прав (r, w, x) и атрибутов безопасности (suid, sgid, stiky bit) при назначении их файлу или каталогу. В таблице должны быть следующие столбцы:* #table(columns: 4)[*атрибут*][*сокращенное название*][*значение действия для файла*][*значение действия для каталога*][read][r][разрешает чтение файла][разрешает просматривать содержимое каталога `ls`][write][w][разрешает изменять или удалять файл][разрешает создавать и удалять файлы внутри каталога][execute][x][разрешает выполнять файл как программу][разрешает входить в каталог `cd`][setuid][s (u+s)][файл выполняется с правами владельца][не применяется][setgid][s (g+s)][файл выполняется с правами группы][новые файлы внутри каталога наследуют группу каталога][sticky][t][не применяется][удалять файлы может только владелец или root (пример: /tmp)] *В Linux существует расширенные права на файлы или каталоги. Работать с ними можно с помощью утилит satfacl и getfacl. Приведите пример команды, с помощью которой мы можем дать конкретному пользователю все права на файл, не делая его владельцем и не добавляя его в группы.* Чтобы дать пользователю `alex` все права на файл `/DATA/info.txt`, не меняя владельца и групп: ```bash sudo setfacl -m u:alex:rwx /DATA/info.txt ``` Проверить можно: ```bash getfacl /DATA/info.txt ``` === Вывод. В ходе лабораторной работы были изучены основы администрирования Linux-систем: настройка NAT с помощью iptables, управление пользователями и правами доступа, работа с ACL и специальными битами, организация аутентификации по SSH-ключам и настройка sudo. На практике реализовано взаимодействие двух виртуальных машин, проброс портов и защита доступа. Получены навыки безопасной настройки сетевых и пользовательских прав в многопользовательской системе.