# Макаров Дмитрий Владиславович - Linux Basic. Практическая работа №2. Администрирование Linux
[toc]
## Практическая работа №2.1 Основы мониторинга OS Linux с помощью утилит df, du, free, iostat, mpstat, vmstat, w, htop.
### 1. Команда df в linux
Утилита df поставляется по умолчанию во всех дистрибутивах Linux и имеет очень простой синтаксис. Фактически вы можете просто набрать df и уже получить результат, но чтобы сделать вывод более читаемым используются дополнительные опции. Вот основной синтаксис:
`$ df опции устройство`
Устройство указывать необязательно, но можно указать раздел диска, о котором мы хотим посмотреть информацию. А теперь рассмотрим основные опции утилиты:
- a, –all – отобразить все файловые системы, в том числе виртуальные, псевдо и недоступные;
- B – изменить размер одного блока перед выводом данных, например, можно использовать BM, чтобы вывести все данные в мегабайтах;
- h – выводить размеры в читаемом виде, в мегабайтах или гигабайтах;
- H – выводить все размеры в гигабайтах;
- i – выводить информацию об inode;
- k – выводить размеры в килобайтах;
- –output – использовать специальный формат вывода, если не задано, выводит все поля. Доступны такие варианты: ‘source’, ‘fstype’, ‘itotal’, ‘iused’, ‘iavail’, ‘ipcent’, ‘size’, ‘used’, ‘avail’, ‘pcent’, ‘file’ и ‘target’;
- P – использовать формат вывода POSIX;
- –total – выводить всю информацию про использованное и доступное место;
- t, –type – выводить информацию только про указанные файловые системы;
- x – выводить информацию обо всех, кроме указанных файловых систем;
Чтобы посмотреть доступное пространство на всех примонтированных разделах и информацию о них достаточно набрать:
`df`

Чтобы посмотреть доступное пространство на всех примонтированных разделах и информацию о них достаточно набрать:
`df -h`

Если задать опцию -a, вы можете получить информацию обо всех файловых системах известных ядру, которые были смонтированы:
`df -a`

Здесь отображается огромное количество виртуальных файловых систем ядра. Если вы хотите вывести только информацию про реальные файловые системы на жестком диске можно использовать опцию -x чтобы отфильтровать все tmpfs:
`df -x tmpfs`

Также можно отфильтровать две файловые системы:
`df -x devtmpfs -x tmpfs`

Или же указать файловую систему, которую нужно отображать:
`df -t ext4`

Также можно указать интересующий вас раздел, как вы видели в синтаксисе команды:
`df -h /dev/sda1`

С помощью опции -i вы можете посмотреть информацию про состояние inode в вашей файловой системе:
`df -hi /dev/sda1`

Вывести объем доступного пространства в каталоге:
`df -h /home`

### 2. Команда du в Linux
**Команда du** , сокращение от «использование диска», сообщает приблизительный объем дискового пространства, используемого данными файлами или каталогами. Это практически полезно для поиска файлов и каталогов, занимающих большие объемы дискового пространства.
`du [OPTIONS]... FILE...`
Если данный FILE является каталогом, du будет суммировать использование диска для каждого файла и подкаталога в этом каталоге. Если *FILE* не указан, *du* сообщит об использовании диска в текущем рабочем каталоге .
При выполнении без какой-либо опции du отображает использование диска для данного файла или каталога и каждого из его подкаталогов в байтах.
`du ~/Documents`

Вы также можете передать команде du несколько файлов и каталогов в качестве аргументов:
`du ~/Documents ~/Pictures ~/.zshrc`

Параметр -a указывает du сообщать об использовании дискового пространства каждым файлом в каталоге.
`du -a ~/Documents`

Чтобы получить общий размер */var/lib* и всех его подкаталогов, вы должны выполнить следующую команду:
`sudo du -h /var`

Чтобы сообщить только общий размер указанного каталога, а не подкаталогов, используйте параметр *-s* :
`sudo du -sh`

Параметр *-c* указывает *du* сообщать общую сумму. Это полезно, когда вы хотите получить объединенный размер двух или более каталогов.
`sudo du -csh /var/log /var/lib`

Если вы хотите отобразить использование диска подкаталогами *n-уровня*, используйте параметр *--max-depth* и укажите уровень подкаталогов. Например, чтобы получить отчет о каталогах первого уровня, вы должны использовать:
`sudo du -h --max-depth=1 /var/lib`

По умолчанию утилита *du* повторно использует дисковое пространство, используемое каталогом или файлом. Чтобы узнать очевидный размер файла, используйте переключатель *--apparent-size* . «Видимый размер» файла — это фактический объем данных в файле.
`sudo du -sh --apparent-size /var/lib`

du также позволяет использовать шаблон оболочки. Например, чтобы получить размер всех каталогов, начинающихся с «Do» в вашем домашнем каталоге, вы должны запустить:
`sudo du -csh ~/Do*`

Команду *du* можно комбинировать с другими командами с конвейерами.
Например, чтобы напечатать 5 самых больших каталогов внутри каталога */var* вы должны передать вывод du в команду sort чтобы отсортировать каталоги по их размеру, а затем передать результат в команду head которая распечатает только 5 верхних каталогов:
`sudo du -h /var/ | sort -rh | head -5`

### 3. Команда free в Linux
Синтаксис free команды следующий:
`free [OPTIONS]`
При использовании без какой-либо опции команда free будет отображать информацию о памяти и подкачке в килобайтах. 1 килобайт (КиБ) равен 1024 байтам.
`free`
Если вы хотите, чтобы буферы и кеш отображались в двух отдельных столбцах, используйте параметр `-w`.
Доступно — оценка объема памяти, доступного для запуска новых приложений без подкачки.
По умолчанию команда free показывает информацию о памяти в килобайтах. Чтобы просмотреть информацию в удобочитаемом формате (обычно в мегабайтах и гигабайтах), используйте параметр `-h`.
`-g` — Показать вывод в гигабайтах.

`free --mega`

`free -h -t`
`free -s 5`

`free -s 5 -c 10`

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

`watch free -h`

### 4. iostat
Процесс установки iostat очень прост. iostat является частью пакета sysstat, который можно установить на вашей соответствующей системе одной из команд ниже:
`sudo apt-get install sysstat`

IOSTAT инструмент, который доступен через команду iostat. Введите эту команду, чтобы увидеть, как она работает:
`iostat`

**Синтаксис iostat очень простой. Вам достаточно выполнить:**
`$ iostat опции устройство интервал`
Параметры устройство и интервал необязательные. Первый указывает по какому устройству показывать статистику, а второй, с каким интервалом обновлять данные. Давайте сначала рассмотрим опции программы, которые могут вам пригодится:
- с - отобразить только информацию об использовании процессора;
- d - отобразить только информацию об использовании устройств;
- h - выводить данные в отчёте в удобном для чтения формате;
- k - выводить статистику в килобайтах;
- m - выводить статистику в мегабайтах;
- o JSON - выводить статистику в формате JSON;
- p - вывести статистику по устройству и всех его разделам;
- x - вывести расширенную статистику;
- y - отображать статистику с момента запуска утилиты, а не системы;
- z - спрятать информацию о дисках, у которых нет активности.
`sudo iostat -h`

Чтобы посмотреть данные по нужному устройству просто укажите это устройство:
`sudo iostat /dev/sda1`

Можно посмотреть статистику по каждому разделу устройства, тогда надо воспользоваться опцией -p:
`sudo iostat -p /dev/sda1`

Чтобы утилита автоматически обновляла данные каждую секунду просто добавьте интервал. Например:
`sudo iostat -p /dev/sda1 1`

Если вы не хотите чтобы утилита суммировала все данные с момента запуска операционной системы, то можно использовать опцию -y. Но работает она только если задан интервал:
`sudo iostat -y -p /dev/sda1 1`

Для начала разумно сохранить df -hl для того чтобы понимать о каких разделах идет речь.
`df -h`
Хорошо будет, если физическое устройство разбито на разные логические разделы для каждого компонента. Этим мы сможем оценить профиль использования системы ввода-вывода для каждого разнесенного компонента.
**Наблюдение**
В отличии от других утилит iostat не очень приспособлен для логирования с учетом времени. Ну ничего, awk в помощь.
**Строчка для получения лог файла:**
`iostat -xk -t 10 | awk '// {print strftime("%Y-%m-%d %H:%M:%S"),$0}' >> iostat.log &`

### 5. mpstat
`mpstat`
Опция «-А», показывает всю информацию, которая может быть отображена с помощью команды mpstat, как показано ниже. Это действительно эквивалентно команде «-I ALL -u -P mpstat ALL» команды:
`mpstat -A`

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

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

Можно выполнить `mpstat -V` чтобы показать версию утилиты:

Дополнительные опции
`mpstat --help`

### 6. vmstat
В первую очередь нужно вызвать команду vmstat, которая предоставляет краткую информацию о различных ресурсах системы и связанных с ними неполадках, приводящих к снижению производительности.
Отчет команды vmstat содержит статистическую информацию о нитях ядра, находящихся в очереди выполнения и ожидающих запуска, а также об оперативной памяти, подкачке, дисках, прерываниях, системных вызовах, переключении контекста и работе процессора. В информации о процессоре указывается доля времени, в течение которой процессор работал в пользовательском режиме, системном режиме, простаивал и ожидал завершения операции дискового ввода-вывода.
Для получения информации о работе процессора удобнее использовать команду vmstat, а не iostat, так как ее построчный вывод проще анализировать, а в случае, когда к системе подключено много дисков, ее вывод намного менее объемный. Приведенный ниже пример иллюстрирует применение vmstat для обнаружения программ, которые потребляют слишком много ресурсов CPU.
`vmstat`
`vmstat -a`
(active/inactive memory) - активная/неактивная память
`vmstat -f`
(number of forks since boot) - количество вилок с момента загрузки
`vmstat -d`
(disk statistics) - статистика диска

`vmstat -D`
(summarize disk statistics) - (общая статистика диска)

`vmstat --help`

`vmstat 1` - 60 - через какое количество секунд выводить информацию

### 7. Утилита/команда w
Выводит краткую сводку о работающих в системе в данный момент пользователях (залогиненных пользователях), а также о том, какие процессы у них запущены

`- h` - Не выводить заголовок у таблицы.
`- u` - Игнорировать имена пользователей при определении времени текущего процесса и времени CPU.
`- s` - Использовать сокращенный формат вывода. Не выводить колонки JCPU и PCPU.
`- f` - Включить или выключить вывод поля from, которое соответствует имени удаленного хоста (remote hostname). В зависимости от дистрибутива Linux (версии утилиты w), поле from может выводиться или не выводиться по умолчанию.
`- i` - Выводить в поле from IP-адрес вместо имени хоста (hostname), если это возможно.
`- o` - Выводить информацию в старом формате. Время, которое меньше 1 минуты, не выводится.
USER — имя пользователя.
TTY — название терминала.
FROM — название удаленного компьютера или IP-адрес.
LOGIN — время входа в систему.
IDLE — время бездействия.
JCPU — время, использованное всеми процессами, подключенными к tty. Оно не включает завершенные фоновые задания, но включает фоновые задания, работающие в данный момент.
PCPU — время, использованное текущим процессом, который указан в поле WHAT.
WHAT — текущий процесс (командная строка текущего процесса).
`- V` - Вывести версию утилиты w.

### 8. Утилита htop
**Как установить htop**
Установите пакет с именем htop используя менеджер пакетов для вашего дистрибутива.
В Debian, Linux Mint, Ubuntu, Kali Linux и их производных выполните:
`sudo apt install htop`

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

**Как ускорить или замедлить частоту обновления htop**
Для установки времени обновления htop используйте опцию -d после которой укажите время обновления в десятой части секунд.
*Например, чтобы программа обновляла окно каждую 1/10 секунды:
`sudo htop -d 1`

## Практическая работа №2.2 Установка и настройка сервера SSH в Linux
Узнаем ip хоста - Kali Linux

### 1. Установка пакетов SSH
`$ sudo apt-get install ssh`

`$ systemctl status sshd`

### 2. Настройка SSH
Режим работы SSH-сервера с настройками по-умолчанию хоть и является вполне работоспособным для небольших частных сетей, всё же нуждается в задании некоторых важных параметров для использования на высоконадёжных публичных серверах. Настройки демона хранятся в файле `/etc/ssh/sshd_config`. Посмотреть его можно командой
`cat /etc/ssh/sshd_config`

Изменим файл конфига в соответствии с задачей


Настройки для алиасов хранятся либо глобально в `/etc/ssh/ssh_config`, либо раздельно для пользователей в `~/.ssh/config`. Здесь нужно не спутать с `ssh_config!`

**Для применения сделанных настроек необходим перезапуск SSH-сервера:**
`$ systemctl restart sshd`

### 3. Настройка и использование клиента SSH
Введём нового пользователя

С помощью PuTTY подключимся к серверу

## Практическая работа №2.3 Установка и настройка SSH-authorized_keys
### 1. Как работают ключи SSH?
Сервер SSH может использовать много разных методов аутентификации клиентов. Наиболее простой метод — аутентификация с помощью пароля. Этот метод просто использовать, но он не является самым безопасным.
Хотя пароли отправляются на сервер в безопасном режиме, обычно они недостаточно сложные и длинные, чтобы обеспечить надежную защиту против упорных злоумышленников, совершающих многократные атаки. Вычислительная мощность современных систем и автоматизированные скрипты позволяют достаточно легко взломать учетную запись методом прямого подбора пароля. Хотя существуют и другие методы усиления мер безопасности (fail2ban и т. д.), ключи SSH показали себя надежной и безопасной альтернативой.
### 2. Создание ключей SSH
Первый шаг для настройки аутентификации ключей SSH на сервере заключается в том, чтобы сгенерировать пару ключей SSH на локальном компьютере.
Для этого мы можем использовать специальную утилиту ssh-keygen, которая входит в стандартный набор инструментов OpenSSH. По умолчанию она создает пару 2048-битных ключей RSA, что подходит для большинства сценариев использования.
Сгенерируйте на локальном компьютере пару ключей SSH, введя следующую команду:
`ssh-keygen`

### 3. Как скопировать открытый ключ на ваш сервер
Самый удобный способ скопировать открытый ключ на существующий сервер — использовать утилиту под названием ssh-copy-id. Поскольку этот метод очень простой, если он доступен, его рекомендуется использовать.
Синтаксис выглядит следующим образом:
`ssh-copy-id username@remote_host`

Аутентификация по паролю

### 4. Аутентификация на сервере с использованием ключей SSH
Если вы успешно выполнили одну из вышеописанных процедур, вы сможете войти на удаленный хост без пароля учетной записи для удаленного хоста.
Воёдм на удалённый хост с помощью **passphrase**
Базовый процесс выглядит аналогично:
`ssh username@remote_host`


### 5. Отключение аутентификации с помощью пароля на сервере
Откройте файл конфигурации демона SSH:
`sudo nano /etc/ssh/sshd_config`
Найдите в файле директиву PasswordAuthentication. Она может быть помечена как комментарий. Удалите символ комментария в начале строки и установите значение «no». После этого вы потеряете возможность входа в систему через SSH с использованием паролей учетной записи:
`PasswordAuthentication no`

Подключаемя без аутентификации

Проверяем, что на PuTTY такая процедура не сработает

## Практическая работа №2.4 Сбор информации о Linux и WGET
### 1. Базовый сбор информации
Начнём со сбора информации о дистрибутивах
*`cat /etc/release`- информация о дистрибутиве и какая версия его*

**По ядру linux можно понять следующее:**
`uname -a`

**whoami**
Как следует из названия, команда `whoami` выводит имя пользователя для эффективного идентификатора пользователя. Другими словами, он отображает имя текущего вошедшего в систему пользователя.

**Команда `uptime` покажет, когда и сколько система работала и соответственно, если она работала без перерыва 3 года, то злоумышлинник может воспользоваться старыми уязвимостями для получения доступа или внедрения кода.**

**Давайте посмотри права директории `/home`**

**Чтобы ограничить права другим пользователям делаем следующее
`sudo chmod o-rx /home/kali`**

**`ip neigh` - показывает с какими компьютерами происходит обмен данными**

**`sudo ss -tlnp` - показывает какие сервисы и с какими портами запущены**

**`sudo -l` - позволяет нам понять, что есть в этом машинки и что пользователь может**

### 2. Суидные файлы
В системе могут быть различные закладки
`sudo find / -user root -perm -4000 -exec ls -ldb {} \\; 2> /dev/null`

Нам надо скопировать ссылку данной утилиты и скачать её с помощью wget
`wget <https://downloads.cisofy.com/lynis/lynis-3.0.6.tar.gz>`

tar xfv lynis-3.0.3.tar.gz

Затем давайте проверим контрольную сумму с сайта и то, что мы скачали делается это следующей командой
`sha256sum lynis-3.0.6.tar.gz`

`3005346e90339c18a4c626169c6f1d9fb8643bb0d0a049bcaf64b7ccb4fd272c`

`cd lynis`
`ls`

**далее запускаем утилиту lynis**
`sudo ./lynis audit system`

*нажимаем Enter*

*Это вывод report-отчёт*

**ещё можно набрать команду** `./lynis show options`

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

### 3. Проверка целостностей пакетов
**dpkg** является довольно низкоуровневой утилитой. Существуют более высокоуровневые утилиты, например APT, которые могут загружать пакеты из сетевого репозитория и отслеживать зависимости между пакетами. Конечным пользователям следует использовать утилиты с более дружественным интерфейсом, такие как Aptitude или Synaptic, предоставляющие лёгкий способ просмотра списка пакетов, их описания и зависимостей.
для просмотра пакетов в системе
`dpkg -l`

для просмотра установленных утилит необходимо набрать следующую команду
`dpkg -L coreutils` - она покажет все штатные утилиты

например рассмотрим утилиту `/bin/dir
/bin/dir --help`
которая позволяет нам работать по сути как `ls`

сделаем backup `sudo mv /bin/dir /bin/dir.bak`
вводим команду `sudo cp /bin/false /bin/dir`

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

`sudo apt install debsums`

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

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

Далее если надо сделать по одному конкретному пользователю необходиму следующие:
`sudo find /home/kali/ -printf "%T@;%Tc;%p\\n" > timeline.csv`
Затем желательно это отсортировать, например:
`head timeline.csv` сейчас никак не отсортированно

Но давайте отсортируем данный файл с помощью команды:
`sort -rn timeline.csv | less`
где флаг `-r` как раз будет указывать, что последнее изменение будет первым

## Практическая работа №2.5 Переменные окружения в Linux .bashrc, .bash_profile и .bash_login
### 1. Просмотр списка системных переменных окружения
Вы можете без проблем самостоятельно просмотреть все присутствующие в Linux системные и пользовательские переменные и их понятия с помощью всего лишь одной команды, которая отобразит список. Для этого потребуется выполнить всего несколько простых действий через стандартную консоль.
Пропишем команду sudo `apt-get install coreutils`, чтобы проверить наличие данной утилиты у вас в системе и сразу же установить ее при надобности.
*Процесс укажет какие добавлены новые файлы или их наличии в библиотеках.*

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

### 2. Запуск команд с указанием нового значения переменной окружения
Можно самостоятельно на время изменить опцию любого параметра, чтобы запустить с ним определенную программу или выполнить любые другие действия. В таком случае в консоли вам будет достаточно прописать `env VAR=VALUE`, где `VAR` — название переменной, а `VALUE` — ее значение, например, путь к папке `/home/kali`.

#### 2.1 Установка и удаление локальных переменных окружения
Запустите «Терминал» и напишите команду `VAR=VALUE`, после чего нажмите на клавишу `Enter`. Как обычно, VAR — любое удобное название переменной одним словом, а `VALUE` — значение.
Проверьте действенность произведенных действий, введя `echo $TESTKALI`. Строчкой ниже вы должны получить опцию переменной.

Удаляется любой параметр командой `unset TESTKALI`.
Проверить удаление можно также через
`echo $TESTKALI`

#### 2.2 Добавление и удаление пользовательских переменных
Рассмотрим классы переменных, которые хранятся в конфигурационных файлах, а из этого выплывает то, что придется редактировать сами файлы. Делается это с помощью любого стандартного текстового редактора.

*Пользовательскую конфигурацию можно редактировать через* `sudo nano .bashrc.`

*Обновление конфигурации произойдет после повторного старта файла, а делается это через* `source .bashrc.`

*Проверить активность переменной можно через ту же опцию* `echo $TESTKALI`.

#### 2.3 Создание и удаление системных переменных окружения
**Осталось только затронуть третий класс переменных — системные.**
Редактироваться для этого будет файл /ETC/PROFILE, который остается активным даже при удаленном подключении, например, через известный многим менеджер SSH. Открытие конфигурационного элемента осуществляется примерно так же, как и в предыдущем варианте:
введите `nano /etc/profile`

Внесём `TESTKALI2=/home/kali12345`
Сохраняем и выходим.
Пишем команду `source /etc/profile` - чтобы изменения вступили в силу.
Проверяем:
`echo $TESTKALI2=/home/kali12345`
