# 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)