---
# System prepended metadata

title: Linux. Практическая работа №2

---

# Linux. Практическая работа №2

## Практическая работа №2.1

**Цель работы:**
Изучить работу утилит df, du, free, iostat, mpstat, vmstat, w, htop.

 **1. Команда df в linux**

На скрине сверху вниз выполнены команды 
`df` - посмотреть доступное пространство на всех разделах системы. Неудобно. Вывод в килобайтах
`df -h` - Та же функция ,но уже лучше. Здесь вывод в мега- и гигабайтах. Читабельно.
`df -a` - показывает все файловые системы ядра.
 ![](https://i.imgur.com/CyET9Iq.jpg)


`df -x tmpfs` - показать только реальные ФС
`df -x devtmpfs -x tmpfs` - исключить из результатов две файловые системы
`df -t ext4` - посмотреть только ext4
`df -h /dev/sda1` - либо посмотреть нужный раздел
`df -hi /dev/sda1` - посмотреть состояние inode в выбранной ФС.
`df -h /home` - посмотреть свободный объем каталога

![](https://i.imgur.com/vJudnqD.jpg)

**2. Команда du в Linux**

Команда du показывает сколько места занято на диске. 

`du ~/Downloads` - размер каталога в байтах.
`du ~/Music ~/Downloads` - размер нескольких каталогов.
`du -a ~/Music` - размер каждого файла в каталоге
`du -h ~/Music` - занятое место в читабельном виде.

![](https://i.imgur.com/FacfU4W.jpg)

Чтобы посмотреть только размер каталога пользуем ключ -s
`du -sh ~/Music`

![](https://i.imgur.com/4GNjkbs.jpg)


Теперь, посмотрим как отобразиться значение занятого пространства для папки /var с использованием sudo и без него.

![](https://i.imgur.com/BWrYG4b.jpg)

Очевидно, что использовать sudo необходимо.

`du -csh ~/Music ~/Downloads` - -c выводит общую сумму размеров указанных каталогов.
`sudo du -h --max-depth=1 /var` - отобразить использование диска подкаталогами до уровня, указанного в --max-depth.
`sudo du -sh --apparent-size /var` -фактический объем данных в файле.
`sudo du -csh ~/Do*` - использовать шаблон имени каталога

![](https://i.imgur.com/FnTxYQ9.jpg)

Также, команду du можно комбинировать с другими командами, например с grep:
`sudo du -h /var | grep "tmp"`

![](https://i.imgur.com/07DlWzI.jpg)

**3. Команда free в Linux**

Команда free предоставляет информацию об общем объеме физической памяти и памяти подкачки , а также о свободной и используемой памяти.

Далее стандартно
`free` - вывод о состоянии памяти (значения в килобайтах).
`free -h` - вывод о состоянии памяти (значения в мега- и гига-байтах).
`free --giga`- вывести значения в гигабайтах.
`free -h -t` - добавить в вывод общее значение по столбцам.

![](https://i.imgur.com/ah1an9t.jpg)

`free -s 5` - печатать результат каждые 5 секунд
`free -s 5 -с 4` печатать результат каждые 5 секунд, 4 раза.

![](https://i.imgur.com/6Z1x778.png)

**3.1 Команда free в Linux с примерами**

Автоматизируем команду free, чтобы отследить как изменяется свободная память при работе с браузером.

`free -h --si -s 5 -c 4`

![](https://i.imgur.com/zsW7kV9.jpg)

Также, есть команда watch. Используя эту команду совместно с free, мы можем наблюдать состояние памяти.
`watch free -h`

![](https://i.imgur.com/scmLakO.jpg)

**4. iostat**

Показывает статистику по устройству с момента включения.

`iostat` - данные в килобайтах
`iostat -h` - данные в удобном формате.
`sudo iostat /dev/sda1` - посмотреть данные по нужному устройству
`sudo iostat -p /dev/sda1` - посмотреть статистику по каждому разделу устройства

![](https://i.imgur.com/Ohyvt6r.jpg)


`sudo iostat -p /dev/sda1 1` - добавляем интервал (1сек) для автоматического обновления данных.

![](https://i.imgur.com/kRnlz8A.png)

`sudo iostat -y -p /dev/sda 1` - -y не суммировать данные с момента запуска. Работает ТОЛЬКО если задан интервал.

![](https://i.imgur.com/2HXoNja.png)

**4.1 Профилирование нагрузки на файловую систему с помощью iostat**

Сохраняем `df -hl` чтобы понимать какие есть разделы

![](https://i.imgur.com/rekbaLy.jpg)

Начинаем записывать в лог данные. Запись ведем в утилите `screen`
`screen iostat -xk -t 10 | awk '// {print strftime("%Y-%m-%d %H:%M:%S"),$0}' >> iostat.log &`

![](https://i.imgur.com/NMrDKnD.jpg)

Интервал -t 10 подбирается эмпирически, обычно в от 3 до 10 сек.
Первый блок - это измерения за период работы с момента старта. Остальные за время указанный интервал.
Далее необходимо запустить логгирование, например на пару суток, а потом будем анализировать лог.

**Анализ**

В первую очередь обращаем внимание на последнюю колонку *%util*. Значения должны быть как минимун не предельные (90%-100%).

**Параметры записи/чтения:**
Данные берем не из стартового блока, а из статистического.
Интересуют колонки rkB/s, wkB/s, r/s, w/s, await, svctm.

Эти данные помогут оптимизировать работу приложения:
При открытии большого числа, и поочередной активации открытх окон — r/s,w/s начнут стремиться к rrqm/s и wrqm/s, и avgrq-sz падать.
В нормальном состоянии, стремиться они будут к единичке (а лучше к нолику), а avgrq-sz расти.

Из данных скрина, могу сказать, что учебная система работает удовлетворительно.

**5. mpstat**

mpstat — отчет о использовании процессоров. Выполнение без параметров показывает статистику о процессорах с момента запуска системы (загрузки).


`mpstat -A` - отображает всю информацию.
![](https://i.imgur.com/1FyiQns.png)

`mpstat -P ALL` - показывает все индивидуальные процессоры или ядра вместе со статистикой:

Видим, что процессор на машине один.
![](https://i.imgur.com/NF3vbiv.jpg)

### 5.3 Для отображения статистически о конкретном CPU или ядре, используйте опцию «-P», как показано ниже:

`mpstat -P 0` - отображает статистику о конкретном CPU или ядре. 
Все-таки один процессор.
![](https://i.imgur.com/Wmllzt9.jpg)

`mpstat -V` - просмотр версии утилиты
`mpstat --help` - справка

![](https://i.imgur.com/LHB6V1q.jpg)


**6. vmstat**

Это утилита, которая предоставляет краткую информацию о различных ресурсах системы и связанных с ними неполадках, приводящих к снижению производительности.
Удобнее чем iostat. Можно использовать для обнаружения программ, которые потребляют слишком много ресурсов CPU.

`vmstat -a` - активная/неактивная память
`vmstat -f` - количество вилок с момента загрузки
`vmstat -d` - статистика диска
`vmstat -D` - общая статистика диска
`vmstat -help` - справка
`vmstat 1 - 60` -интервал между обновлением информации, в секундах

![](https://i.imgur.com/4TCltuW.jpg)


**7. Утилита/команда " w "**

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

`w -h` - не выводить заголовок у таблицы
`w -u` - Игнорировать имена пользователей при определении времени текущего процесса и времени CPU
`w -s` - Использовать сокращенный формат вывода. Не выводить колонки JCPU и PCPU
`w -f` - Включить или выключить вывод поля from
`w -i` - Выводить в поле from IP-адрес вместо имени хоста
`w -o` - Выводить информацию в старом формате
`w -V` - версия утилиты

![](https://i.imgur.com/JrWTJR0.jpg)


**8. Утилита htop**

Установка на Кали происходит с помощью команды
`sudo apt install htop`


`htop` - просмотреть все процессы в Linux

![](https://i.imgur.com/uJtwON8.jpg)


Команду htop можно запускать как с правами обычного пользователя.
Также можно использовать права суперпользователя
`sudo htop`
Они нужны для изменения приоритета процессов, для закрытия процессов других пользователей.

`sudo htop -d 1` - частота обновления данных, где 1 = 1/10сек. Т.е. -d 50 это обновление данных один раз в пять секунд.

`sudo htop -t` - вывести процессы в виде дерева

![](https://i.imgur.com/WdJtaob.jpg)

---

## Практическая работа №2.2

**Цель работы:** Научиться настраивать SSH-сервер, клиент.

### 1. Установка пакетов SSH

`sudo apt-get install ssh` - установка пакета
` systemctl status sshd` - проверить статус сервиса
или так
` service sshd status`

![](https://i.imgur.com/lruoaMr.jpg)


## 2. Настройка SSH


`/etc/ssh/sshd_config` файл конфигурации ssh

Важные параметры:

Port - лучше не 22
AddressFamily - значение inet

ListenAddress 10.24.205.75:2123
ListenAddress 10.24.205.76:2124
позволяет задавать порты для отдельных сетевых интерфейсов

Protocol 2 - оставляем только SSHv2

`PubkeyAuthentication yes` - аутентификация и шифрование по ключу.

Тогда серверу необходимо явно указывать, где хранятся открытые ключи пользователей. Это может быть как один общий файл для хранения ключей всех пользователей (обычно это файл `etc/.ssh/authorized_keys`), так и отдельные для каждого пользователя ключи. Второй вариант предпочтительнее в силу удобства администрирования и повышения безопасности:

`AuthorizedKeysFile etc/ssh/authorized_keys # Для общего файлаAuthorizedKeysFile %h/.ssh/authorized_keys # Файл -> пользователь`

`PasswordAuthentication no` - отключить парольный доступ

`PermitEmptyPasswords no` - или как минимум отключать авторизацию по пустому паролю 

- Для указания разрешённых или запрещённых пользователей и групп служат директивы DenyUsers, AllowUsers, DenyGroups, и AllowGroups. Значениями для них являются списки имён, разделяемых пробелами, например:

```
DenyUsers fred john
AllowGroups root clients administrators

```

`PermitRootLogin no` - отключить root-доступ




![](https://i.imgur.com/Ik8q6Dc.jpg)


`$ systemctl restart sshd` -для применения настроек перезапустим сервис

или так

`$ service sshd restart`

## 3. Настройка и использование клиента SSH

`ssh user_name@host_name` - подключение к серверу

## 4. Для генерации ключей используется утилита ssh-keygen:

`$ ssh-keygen` - генерация ключей

Утилита предложит выбрать расположение ключей (лучше всё оставить по-умолчанию), обычно это каталог `~/.ssh/,` ввести парольную фразу для закрытого ключа. После чего будут сгенерированы открытый ключ `id_rsa.pub` и закрытый `— id_rsa`. 

![](https://i.imgur.com/1viV82N.jpg)


Теперь нужно скопировать открытый ключ, т. е. «слепок» закрытого на сервер. Проще всего этого можно добиться командой:

`ssh-copy-id -i ~/.ssh/id_rsa.pub user_name@host_name`

Теперь можно подключаться.

![](https://i.imgur.com/O4s1e6Y.jpg)

Важно заметить, что использование сгенерированных openSSH-ключей несовместимо с PPK-форматом, используемым по-умолчанию в таких комплексах как PuTTY. Поэтому необходимо конвертировать имеющиеся openSSH-ключи в формат PPK. Удобнее всего это делать с помощью утилиты PuTTY – puttygen.exe.

Как это реализуется?
`sudo apt-get install putty` - ставим Путти на Кали
`apt-get install putty-tools` - туда же ставим putty-tools. Нам понадобится Putty Key Generator.

Запустим Putty и протестируем его работу для начала по паролю:

![](https://i.imgur.com/MQjND4x.jpg)


Ключ у нас уже есть. Нужно его конвертировать
`puttygen ~/.ssh/id_rsa -o ~/.ssh/id_rsa.ppk`

После чего передадим конвертированный ключ на целевой сервер **по стандартному порту 22**.
`cat ~/.ssh/id_rsa.ppk | ssh user@192.168.1.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"`

![](https://i.imgur.com/fz2PwzQ.jpg)

**Обратите внимание**, если используется порт отличный от стандартного, то необходимо после user@192.168.1.10 использовать ключ -р 2222, где 2222 - номер порта, по которому устанавливается соединение ssh.

Готово. Осталось проверить.

Наше подключение:
Не забываем указать измененный порт

![](https://i.imgur.com/OkJNFg3.jpg)

В настройках SSH указываем путь до публичного ключа

![](https://i.imgur.com/zY9RqbD.jpg)

Пробуем. Работает!

![](https://i.imgur.com/b1eFPJb.jpg)




---
## Практическая работа №2.3

**Цель работы:**
- научиться настраивать SSH-authorized_keys.
- научиться работать с ключами SSH.


Для практики возьмем построенную нами сеть из модуля "Сети" и добавим в нее сервер Дебиан. Клиентской машиной будет Кали.

![](https://i.imgur.com/1KqO6xp.jpg)

**2. Создание ключей SSH**

На Кали выполним команду `ssh-keygen` и далее - по диалогу создаем ключ.

![](https://i.imgur.com/yTgA7Xw.jpg)

**3. Копируем открытый ключ на сервер**

Используем команду `ssh-copy-id user@192.168.1.10`
И далее также, по диалогу.

**4. Аутентификация на сервере с использованием ключей SSH**
Аутентификация выполняется командой `ssh user@192.168.1.10` после чего будет предложено ввести пароль от удаленного хоста если выполняется вход не по ключам, либо, аутентификация произойдет без ввода пароля, если есть ключи SSH.

![](https://i.imgur.com/rWSTTJP.jpg)

**5. Отключение аутентификации с помощью пароля на сервере**

Отключим использование ssh через пароль. Использование пароля при авторизации снижает безопасность сервера, т.к. возможен взлом с помощью брутфорса.
Для отключения нам понадобится рутовый доступ по ssh либо УЗ пользователя с рутовыми правами.
Изменения вностятся в файл конфигурации демона SSH: `sudo nano /etc/ssh/sshd_config`
раскомментируем строку и установим значение no

`PasswordAuthentication no`

![](https://i.imgur.com/LNeEE1E.jpg)

после чего перезапустим демон ssh: `sudo service ssh restart`

![](https://i.imgur.com/Ko6tTJ1.jpg)

**6. Копирование открытого ключа с помощью SSH**

Для прохождения этого пункта сгенерируем новую пару ключей и выставим доступ по паролю.
После чего, если у нас нет утилиты ssh-copy-id, пробуем переслать открытый ключ на сервер посредством ssh.
Для этого нужно вывести ключ в консоль и передать его по ssh в папку authorized_keys. 
Команда: `cat ~/.ssh/id_rsa.pub | ssh user@192.168.1.10 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"`

![](https://i.imgur.com/YKlhqoB.jpg)

Никаких сообщений и уведомлений, при передаче ключа не было. Но поскольку открытый ключ на локальной машине был перезаписан, а при входе по ssh пароль не спросили и ни разу не ругнулись, считаю что новый ключ был передан. Задача выполнена.


## Практическая работа №2.4

**Цель работы:** Научиться базовому сбору информации о Linux системах.

**1.Базовый сбор информации**

`cat /etc/release` - информация о дистрибутиве и версии ОС
`uname -a` - информация о ядре
`whoami` - имя текущего пользователя

Ограничим права доступа к папке нашего пользователя. Чтобы другие пользователи не могли попасть в директорию.

`sudo chmod o-rx /home/youssr`
`ip neigh` - c какими ПК происходит обмен данными
`sudo ss -tlnp` - какие сервисы и с какими портами запущены.
`sudo -l` - показывает, что есть в этой системе и что пользователь может.

На скрине видно, что:
    - пользователь может все. Запускать любые команды.
    - Никакие сервисы не запущены
    - обмена с другими ПК не происходит

![](https://i.imgur.com/vH5cUKE.jpg)

**2.Суидные файлы**

Проверим, есть ли в системе файлы, запуск которых возможен с правами владельца (suid 4000). Для этого выполним команду `sudo find / -user root -perm -4000 -exec ls -ldb {} \; 2> /dev/null`

![](https://i.imgur.com/50j06X5.jpg)

Как автоматизировать сбор информации? Можно например использовать утилиту **lynis**

Скачиваем ее утилитой wget:
`wget https://downloads.cisofy.com/lynis/lynis-3.0.6.tar.gz
`

Разархивируем: `tar xfv lynis-3.0.6.tar.gz`

Сверим контрольную сумму: `sha256sum lynis-3.0.6.tar.gz`

![](https://i.imgur.com/2NaxKGp.jpg)



Перейдем в директорию lynis и запустим утилиту
`sudo ./lynis audit system`
В процессе, нажимаем Enter и ждем обработки результатов сканирования.
![](https://i.imgur.com/5yh6iYM.jpg)

На выходе получаем report-отчёт:

![](https://i.imgur.com/FVDsp8t.jpg)

Чтобы увидеть все доступные параметры используем `./lynis show options`

![](https://i.imgur.com/D6OkfhQ.jpg)

Перенаправлять файлы лучше через стандартный report утилиты:
`/var/log/lynis-report.dat`
![](https://i.imgur.com/sBpfeXi.jpg)

**3. Проверка целостностей пакетов**

Проверить целостность системы, можно двумя способами:
 - утилитой dpkg;
 - утилитой debsum.

`dpkg -l` - просмотра пакетов в системе

![](https://i.imgur.com/Y1FGAGK.jpg)

`dpkg -L coreutils` -просмотр установленных утилит. Показывает все штатные утилиты.

![](https://i.imgur.com/o4Ug3Bm.jpg)

Теперь поменяем  /bin/false на /bin/dir симитировав подмену кода программы.

Последовательно вводим команды

```
sudo mv /bin/dir /bin/dir.bak
sudo cp /bin/false /bin/dir

```
Мы сделали бэкап утилиты dir и скопировали false в dir

Теперь при запуске dir мы можем увидеть, что ничего не происходит, кроме как если посмотреть логическую ложь, то будет ошибка.
`echo $?`

![](https://i.imgur.com/PwnNb9C.jpg)


Чтобы быстро проверить этот пакет мы можем выполнить команду debsums

- debsums -a - Проверяет все файлы (включая конфигурационные, которые обычно располагаются слева)
- debsums -e - Проверяет только конфигурационные файлы пакетов
- debsums -с - Выводит список измененных на stdout файлов
- debsums -I - Отображает файлы, в которых отсутствует информация о md5sum
- debsums -s - Выводит только ошибки; при их отсутствии не производит никаких действий

Воспользуемся командами
`debsums -ac coreutils`
`debsums -cs coreutils`
Также, можно воспользоваться командой
`dpkg --verify coreutils`

![](https://i.imgur.com/3dJRYvs.jpg)


Контрольные суммы находятся тут `/var/lib/dpkg/info/*.md5sums`

Если кто-то смог проникнуть в систему и что-то делал в ней нам поможет команда find
Например, если нам надо рассмотреть какой либо инцидент:
`sudo find / -printf "%T@;%Tc;%p\\n"`

![](https://i.imgur.com/XYy80Ei.jpg)

Если нужно сканирование по одному конкретному пользователю:

`sudo find /home/youssr/ -printf "%T@;%Tc;%p\\n" > timeline.csv`

![](https://i.imgur.com/vn6Mbjz.jpg)


Для удобства, желательно отсортировать содержимое файла. Чтобы последние изменения были в начале файла:
`sort -rn timeline.csv | less`

Сейчас видно, где и когда вносились последние изменения

![](https://i.imgur.com/HCY4BFE.jpg)

**Практическая работа №2.5**

**Цель работы:** Научиться работать с переменным окружением в linux.

**1. Просмотр списка системных переменных окружения**

Текущие значения системных и пользовательских переменных окружения выводятся командой
`printenv`

Данные выводятся в формате НАЗВАНИЕ ПЕРЕМЕННОЙ=значение.
Также, на скрине отмечены некоторые из основых и часто используемых переменных окружения.
![](https://i.imgur.com/eusqjwE.jpg)

**2. Запуск команд с указанием нового значения переменной окружения**

Можно временно изменить значение любого параметра. Например, чтобы запустить с ним какую либо программу или выполнить другие действия. 
Используем команду `env VAR=value` заменяя VAR и value на необходимую переменную окружения и ее новое значение.

![](https://i.imgur.com/6MFkWbX.jpg)

ВАЖНО! После следующего обращение к этой переменой, она поменяет свое значение на исходное. И область действия такой измененной переменой - только в пределах терминала.

**2.1 Установка и удаление локальных переменных окружения**

Создадим свою собственную локальную переменную окружения:

`env TESTENV=/home/youssr` - создание переменой
`echo $TESTENV` - просмотр значения
`unset TESTENV` - удаление переменной

![](https://i.imgur.com/pSJKKM8.jpg)

**2.2 Добавление и удаление пользовательских переменных**

Поскольку эти переменные хранятся в файлах, то и изменять их (добавлять, удалять или комментировать) мы будем там же, с помощью любого редактора.

`sudo nano .bashrc.` - редактируем файл
`source .bashrc.` - перезапускаем файл

У меня этот файл пустой. Ну да ничего. Сейчас заполним.

![](https://i.imgur.com/JxQXptx.jpg)

Перезапустим и проверим значения

![](https://i.imgur.com/HvLnrX6.jpg)

**2.3 Создание и удаление системных переменных окружения**

В данном случае редактируется файл `/etc/profile` и дальше по накатанной:

- вводим переменную
- сохраняем
- перезапускаем
- проверяем

![](https://i.imgur.com/H5jDtkR.jpg)





