# Linux. Практическая работа №2
## Практическая работа №2.1
**Цель работы:**
Изучить работу утилит df, du, free, iostat, mpstat, vmstat, w, htop.
**1. Команда df в linux**
На скрине сверху вниз выполнены команды
`df` - посмотреть доступное пространство на всех разделах системы. Неудобно. Вывод в килобайтах
`df -h` - Та же функция ,но уже лучше. Здесь вывод в мега- и гигабайтах. Читабельно.
`df -a` - показывает все файловые системы ядра.

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

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

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

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

Очевидно, что использовать 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*` - использовать шаблон имени каталога

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

**3. Команда free в Linux**
Команда free предоставляет информацию об общем объеме физической памяти и памяти подкачки , а также о свободной и используемой памяти.
Далее стандартно
`free` - вывод о состоянии памяти (значения в килобайтах).
`free -h` - вывод о состоянии памяти (значения в мега- и гига-байтах).
`free --giga`- вывести значения в гигабайтах.
`free -h -t` - добавить в вывод общее значение по столбцам.

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

**3.1 Команда free в Linux с примерами**
Автоматизируем команду free, чтобы отследить как изменяется свободная память при работе с браузером.
`free -h --si -s 5 -c 4`

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

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

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

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

**4.1 Профилирование нагрузки на файловую систему с помощью iostat**
Сохраняем `df -hl` чтобы понимать какие есть разделы

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

Интервал -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` - отображает всю информацию.

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

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

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

**6. vmstat**
Это утилита, которая предоставляет краткую информацию о различных ресурсах системы и связанных с ними неполадках, приводящих к снижению производительности.
Удобнее чем iostat. Можно использовать для обнаружения программ, которые потребляют слишком много ресурсов CPU.
`vmstat -a` - активная/неактивная память
`vmstat -f` - количество вилок с момента загрузки
`vmstat -d` - статистика диска
`vmstat -D` - общая статистика диска
`vmstat -help` - справка
`vmstat 1 - 60` -интервал между обновлением информации, в секундах

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

**8. Утилита htop**
Установка на Кали происходит с помощью команды
`sudo apt install htop`
`htop` - просмотреть все процессы в Linux

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

---
## Практическая работа №2.2
**Цель работы:** Научиться настраивать SSH-сервер, клиент.
### 1. Установка пакетов SSH
`sudo apt-get install ssh` - установка пакета
` systemctl status sshd` - проверить статус сервиса
или так
` service sshd status`

## 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-доступ

`$ systemctl restart sshd` -для применения настроек перезапустим сервис
или так
`$ service sshd restart`
## 3. Настройка и использование клиента SSH
`ssh user_name@host_name` - подключение к серверу
## 4. Для генерации ключей используется утилита ssh-keygen:
`$ ssh-keygen` - генерация ключей
Утилита предложит выбрать расположение ключей (лучше всё оставить по-умолчанию), обычно это каталог `~/.ssh/,` ввести парольную фразу для закрытого ключа. После чего будут сгенерированы открытый ключ `id_rsa.pub` и закрытый `— id_rsa`.

Теперь нужно скопировать открытый ключ, т. е. «слепок» закрытого на сервер. Проще всего этого можно добиться командой:
`ssh-copy-id -i ~/.ssh/id_rsa.pub user_name@host_name`
Теперь можно подключаться.

Важно заметить, что использование сгенерированных openSSH-ключей несовместимо с PPK-форматом, используемым по-умолчанию в таких комплексах как PuTTY. Поэтому необходимо конвертировать имеющиеся openSSH-ключи в формат PPK. Удобнее всего это делать с помощью утилиты PuTTY – puttygen.exe.
Как это реализуется?
`sudo apt-get install putty` - ставим Путти на Кали
`apt-get install putty-tools` - туда же ставим putty-tools. Нам понадобится Putty Key Generator.
Запустим Putty и протестируем его работу для начала по паролю:

Ключ у нас уже есть. Нужно его конвертировать
`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"`

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

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

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

---
## Практическая работа №2.3
**Цель работы:**
- научиться настраивать SSH-authorized_keys.
- научиться работать с ключами SSH.
Для практики возьмем построенную нами сеть из модуля "Сети" и добавим в нее сервер Дебиан. Клиентской машиной будет Кали.

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

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

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

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

**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"`

Никаких сообщений и уведомлений, при передаче ключа не было. Но поскольку открытый ключ на локальной машине был перезаписан, а при входе по 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` - показывает, что есть в этой системе и что пользователь может.
На скрине видно, что:
- пользователь может все. Запускать любые команды.
- Никакие сервисы не запущены
- обмена с другими ПК не происходит

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

Как автоматизировать сбор информации? Можно например использовать утилиту **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`

Перейдем в директорию lynis и запустим утилиту
`sudo ./lynis audit system`
В процессе, нажимаем Enter и ждем обработки результатов сканирования.

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

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

Перенаправлять файлы лучше через стандартный report утилиты:
`/var/log/lynis-report.dat`

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

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

Теперь поменяем /bin/false на /bin/dir симитировав подмену кода программы.
Последовательно вводим команды
```
sudo mv /bin/dir /bin/dir.bak
sudo cp /bin/false /bin/dir
```
Мы сделали бэкап утилиты dir и скопировали false в dir
Теперь при запуске dir мы можем увидеть, что ничего не происходит, кроме как если посмотреть логическую ложь, то будет ошибка.
`echo $?`

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

Контрольные суммы находятся тут `/var/lib/dpkg/info/*.md5sums`
Если кто-то смог проникнуть в систему и что-то делал в ней нам поможет команда find
Например, если нам надо рассмотреть какой либо инцидент:
`sudo find / -printf "%T@;%Tc;%p\\n"`

Если нужно сканирование по одному конкретному пользователю:
`sudo find /home/youssr/ -printf "%T@;%Tc;%p\\n" > timeline.csv`

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

**Практическая работа №2.5**
**Цель работы:** Научиться работать с переменным окружением в linux.
**1. Просмотр списка системных переменных окружения**
Текущие значения системных и пользовательских переменных окружения выводятся командой
`printenv`
Данные выводятся в формате НАЗВАНИЕ ПЕРЕМЕННОЙ=значение.
Также, на скрине отмечены некоторые из основых и часто используемых переменных окружения.

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

ВАЖНО! После следующего обращение к этой переменой, она поменяет свое значение на исходное. И область действия такой измененной переменой - только в пределах терминала.
**2.1 Установка и удаление локальных переменных окружения**
Создадим свою собственную локальную переменную окружения:
`env TESTENV=/home/youssr` - создание переменой
`echo $TESTENV` - просмотр значения
`unset TESTENV` - удаление переменной

**2.2 Добавление и удаление пользовательских переменных**
Поскольку эти переменные хранятся в файлах, то и изменять их (добавлять, удалять или комментировать) мы будем там же, с помощью любого редактора.
`sudo nano .bashrc.` - редактируем файл
`source .bashrc.` - перезапускаем файл
У меня этот файл пустой. Ну да ничего. Сейчас заполним.

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

**2.3 Создание и удаление системных переменных окружения**
В данном случае редактируется файл `/etc/profile` и дальше по накатанной:
- вводим переменную
- сохраняем
- перезапускаем
- проверяем
