363 lines
14 KiB
Typst
363 lines
14 KiB
Typst
#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
|
||
<network>
|
||
<name>intnet</name>
|
||
<forward mode='none'/>
|
||
</network>
|
||
```
|
||
|
||
К первой машине я добавил дополнительный интерфейс, подключенный к сети 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<count;i++)); do
|
||
n=$((start+i))
|
||
u="u${n}"
|
||
p="DerParol${n}"
|
||
id -u "$u" >/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 <ip>` адрес подменяется на указанный вручную.
|
||
|
||
*При создании ключей 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. Приведите пример команды, с помощью которой мы можем дать конкретному пользователю все права на файл, не делая его владельцем и не добавляя его в группы.*
|
||
|
||
Чтобы дать пользователю `vlad` все права на файл `/DATA/info.txt`, не меняя владельца и групп:
|
||
|
||
```bash
|
||
sudo setfacl -m u:vlad:rwx /DATA/info.txt
|
||
```
|
||
|
||
Проверить можно при помощи:
|
||
|
||
```bash
|
||
getfacl /DATA/info.txt
|
||
```
|
||
|
||
=== Вывод.
|
||
|
||
В ходе лабораторной работы я изучил основы администрирования linux-систем: настройка nat, управление пользователями и правами доступа, работа с acl, организация аутентификации по ssh-ключам и настройка sudo. На практике реализовано взаимодействие двух виртуальных машин, проброс портов и защита доступа.
|