# Linux Basics Модуль Занятие 3
## Сервисы Linux
### Практическая работа 3.1 Cron
Cron - специальная демон-программа, которая может вызывать в специально определенное время заранее написанные скрипты и таким образом автоматизировать процесс работы на машинах Linux.
Все задачи в cron записываются в специальный существующий для каждого пользователя отдельно файл через утилиту crontab, после чего демон cron раз в минуту просматривает полученную таблицу и выполняет команды, когда время для их выполнения подошло.
Основные возможности команды crontab:
+ посмотреть имеющиеся запланированные действия: `crontab -l`
+ редактирование таблицы: `crontab -e` (также можно указать `-u username` чтобы редактировать таблицу другого пользователя, но *требуются права суперпользователя*)

+ удаление файла с таблицей: `crontab -r`
+ удаление файла с таблицей с подтверждением: `crontab -i`
+ установка нового файла: `crontab /path`
Сама по себе таблица cron состоит из двух частей: таймера запуска и команды для выполнения.
Для определения времени выполнения каждой команды доступно 5 определений временных интервалов.
+ поминутно - указание в какую минуту часа выполнять команду (чаще чем раз в минуту команду выполнять нельзя)
+ почасно - указание часа выполения (0-23)
+ дня месяца (1-31)
+ месяца (1-12)
+ дня недели (нумерация 0-6, но 0 соответсвует воскресенье)
Знак звезды (*) может использоваться для указания "любого" времени.
Вторая часть таблицы включает команду, которую нужно выполнить.
```
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
```
*К примеру, здесь команда создания бекапа данных всех пользователей происходит в первый день недели в пять часов утра*
Для расширения функционала crontab добавлены отдельные символы с дополнительными возможностями:
+ указание нескольких значений времени - запятая
+ указание определенного интервала повторения - тире (0-10 * * * * - выполнение команды каждую из первых десяти минут в часе)
+ указание частоты повторения - слеш и число, указывающее эту частоту
+ использование первых трех букв английских названий дней недели и месяцев.
Часто требуется выполнять команды, записанные в отдельном файле. В таком случае, команда строится из двух путей: пути до интерпретатора команд внутри файла и пути до исполняемого файла:
```
*/30 * * * * /usr/bin/bash <path to .sh script >
```
*Эта запись в таблице cron говорит о выполнении bash-скрипта постоянно каждые полчаса*
Теперь представим 4 скрипта на языке Bash:
1. Здесь происходит логирование состояния системы с помощью нескольких основным команд (vmstat, free, w)
```
#!/bin/bash
echo `date "+%m-%d-%Y %H:%M:%S"` >> ~/cron_scripts/cron_out/statistics_vmstat.log
vmstat >> ~/cron_scripts/cron_out/statistics_vmstat.log
echo `date "+%m-%d-%Y %H:%M:%S"` >> ~/cron_scripts/cron_out/statistics_memory.log
free >> ~/cron_scripts/cron_out/statistics_memory.log
echo `date "+%m-%d-%Y %H:%M:%S"` >> ~/cron_scripts/cron_out/statistics_users.log
w >> ~/cron_scripts/cron_out/statistics_users.log
```
2. Здесь происходит логирование наличия подключения (подключение проверяется по ответу команды ping при обращении к серверу 8.8.8.8)
```
#!/bin/bash
PATH=/bin:/bin/bash:/usr/bin:/sbin:/usr/sbin
IP=("8.8.8.8")
result=$(ping -c 2 -W 1 -q $IP | grep transmitted)
echo $result >> ~/cron_scripts/cron_out/test.txt
pattern="0 received"
pattern2=""
echo $(date "+%d-%m-%Y %H:%M:%S") >> ~/cron_scripts/cron_out/internet_status.log
if [[ $result =~ $pattern ]]; then
echo " no connection" >> ~/cron_scripts/cron_out/internet_status.log
elif [[ $result =~ $pattern2 ]]; then
echo " no connection" >> ~/cron_scripts/cron_out/internet_status.log
else
echo " connection is alive" >> ~/cron_scripts/cron_out/internet_status.log
fi
```
3. Здесь логируется информация о файлах внутри папки /tmp
```
#!/bin/bash
echo "tmp_log" >> /home/kali/cron_scripts/cron_out/tell_tmp.txt
echo `date "+%m-%d-%Y %H:%M:%S"` >> /home/kali/cron_scripts/cron_out/tell_tmp.txt
ls /tmp >> /home/kali/cron_scripts/cron_out/tell_tmp.txt
```
4. Смена фона рабочего стола на случайную картинку с сайта
```
!/bin/bash
wget -O - https://ru.wallpaper.mob.org/pc/ -q |\
grep -Eo 'https://mobimg.b-cdn.net/v3/fetch/.{2}/.{32}.jpeg' |\
shuf -n 1 |\
xargs wget -O /home/kali/cron_scripts/background.jpg -q
xfconf-query -c xfce4-desktop -p /backdrop/screen0/monitorVirtual1/workspace0/last-image -s "/home/kali/cron_scripts/background.jpg"
```
Для запуска этих файлов используются следующие записи в crontab:
```
# m h dom mon dow command
*/15 * * * * /usr/bin/bash ~/cron_scripts/statistics.sh #раз в 15 минут
0 20 * * 0 /usr/bin/bash ~/cron_scripts/tell_tmp.sh # в 20 часов в воскресенье
0 15 * * 3 /usr/bin/bash ~/cron_scripts/pinger.sh #в 15 часов в среду
* * * * * /usr/bin/bash ~/cron_scripts/backgrounds.sh
0 0 * * * echo "work" >> ~/Desktop/somets.txt #каждый день
```
### Практическая работа 3.2 SFTP
SFTP - протокол безопасной передачи данных основанный на SSH (протокол, организующий безопасное соединение на основе тунеля с шифрованием трафика). Он пришел на смену FTP, который не обладал какой-либо защитой и был менее удобен в использовании. SFTP позволяет переходить по папкам в файловой системе сервера, осуществлять просмотр имеющихся файлов и загрузку/выгрузку файлов и папок с клиента на сервер.
В этой работе происходит настройка Linux под работу в виде файлового сервера на основе SFTP, а также анализ работы при просмотре и передаче данных и файлов клиентам через SFTP протокол.
1. Настройка SFTP на Linux
1.1 Для начала создадим пользователя и группу, от имени которых будет происходить управлене в системе при подключении через sftpю

Добавление нового пользователя через `adduser` автоматически создает не только пользователя, но и группу для него. Проверим это, посмотрев группы созданного пользователя

1.2 Теперь перейдем к настройке самой Linux. Для работы sftp нам понадобится наличие пакетов для работы с SSH (сервер и клиент). Если они еще не установлены, выполните команду:
```
sudo apt install openssh
```
Теперь можно заняться конфигурированием демон-процесса SSH. Заходим в файл конфигураций командой:
```
sudo nano /etc/ssh/sshd_config
```
В конец файла потребуется добавить новое правило по отслеживанию группы осуществляющего вход пользователя (для работы с sftp пользователь, под которым происходит вход, должен принадлежать к группе).
Конфигурации, которые мы предоставляем для работы с sftp:
+ ChrootDirectory - пользователю в качестве корня файловой системы будет представлена указанная директория. На скриншоте ниже пользователю предоставлена директория /home
+ X11Forwarding - настройка для работы с графическими приложениями. При работе с sftp используется только терминал, поэтому эту настройку можно отключить
+ AllowTcpForwarding - разрешение использования Linux в качестве proxy-сервера (возможность выходить в сеть с клиента в качестве Linux)
+ ForceCommand - разрешает пользователю использовать только sftp, встроенный в sshd.

После прописывания всех настроек, сохранить и закрыть файл.
1.3 Применяем настройки для sshd процесса:
```
sudo systemctl restart ssh
```

На этом сервер Linux с доступом по SFTP настроен.
1.4 Проверка возможности входа
Для проверки возможности входа на сервер с Windows, попробуем утилиту WinSCP. Скачать можно по [ссылке](https://sourceforge.net/projects/winscp/).
Устанавливаем и запускаем утилиту. Нас встретит окно данными, которые будут использоваться для входа на удаленный сервер. Нужно выбрать протокол передачи (SFTP), ввести ip-адрес Linux-сервера, порт входа (по умолчанию 22), а также данные созданного в пункте 1.1 пользователя.

После нажатия кнопки войти нам будет доступна файловая система Linux-сервера с уровня /home.

1.5 Использование для входа утилиты FileZilla ([ссылка для скачивания](https://filezilla.ru/get/))
Здесь чтобы организовать подключение, нужно также, как и в WinSCP ввести данные сервера и пользователя. Для выбора протокола нужно использовать синтаксис вида `sftp://ip-адрес`

После нажатия кнопки *Быстрое соединение* нам будет доступна файловая система на Linux-сервере.

1.6 Использование терминала для взаимодейтсвия с SFTP-сервером. При таком способе взаимодействия мы не можем выполнять команд, основанных на возможностях оболочки, и не можем вызывать другие программы. Нам доступно только взаимодействие с файловой системой. Для подключения нужно использовать утилиту sftp. Использование схоже с использованием ssh:
```
sftp <user>@<host>
```


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

После можем посмотреть, что он загружен на сервер

А теперь скачаем файл с помощью команды *put*

1.7 Анализ трафика при использовании протокола SFTP
Т.к. протокол SFTP работает на основе протокола SSH, и использует создаваемый в SSH шифрованный тунель, то и данные, которые отправляет сервер клиенту или наоборот, будут проходить по тунелю SSH. Проверим это: запустим на Linux утилиту Wireshark и зайдем на сервер через протокол SFTP и утилиту FileZilla

Как мы видим, клиент и сервер обмениваются данными на основе проткола SSH версии 2 при совершении любых действий на удаленном сервер через FileZilla. Для установки работы протокола сначала отправляются TCP пакеты, которые устанавливают TCP сессию. После происходит передача файлов уже в зашифрованном виде, и отпечаток этих данных можно посмотреть в пакетах SSH.

### Практическая работа 3.3 Другие сервисы Linux
Рассмотрим другие часто использующиеся сервисы Linux, а также общую систему управления ими.
Сами по себе сервисы не могут быть запущены в системе, т.к. у каждого исполняемого процесса должен быть процесс, который его вызвал. Для вызова служб на исполнение используется демон-инициализатор (отличается для семейств дистрибутивов). С помощью команд для этого процесса можно внести отдельные службы в автозагрузку, и, таким образом, заставить программы выполняться сразу после загрузки компьютера.
Для работы с процессами в Debian-семействе дистрибутивов используются процесс *systemd*. Управление процессами можно осуществлять с помощью двух утилит: service и systemctl.
Основное управление процессом *systemd* осуществляет утилита systemctl. Для других процессов соответственно используются другие утилиты.
Чтобы унифицировать базовое управление демон-процессами, используется утилита service. Она позволяет запустить или остановить процесс, а также посмотреть состояние процесса.
Для более тонкой настройки процессов-инициализаторов уже применяется утилита потипу systemctl.
В базовом управлении systemctl и service очень схожи. Синтаксис команд предполагает название утилиты, название демона-процесса и тип действия, которое нужно совершить над процессом.
```
systemctl <start, restart, stop> <service>
service <service> <start, restart, stop>
```
Из дополнительных возможностей systemctl выделим возможность добавления процесса в автозагрузку (service на такое уже не способен)
```
sudo systemctl <enalbe\disable> <service>
```
Эти команды используются для настройки сервисов, которые будут рассмотрены далее.
Для того, чтобы посмотреть состояние всех процессов, используется команда:
```
service --status-all
```

Дерево же всех запущенных процессов можно посмотреть через systemctl:
```
systemctl status
```

Перейдем к исследованию сервисов:
1. Apache
Кроссплатформенный сервис для создания веб-серверов, основанный на модульной архитектуре. БольшАя часть всех сайтов в Интернете работает на Apache. При этом сервис разрабатывается некомерческой организацией и поддерживается не частной компанией, а сообществом (и поэтому является бесплатным).
Попробуем посмотреть, как будет выглядеть Apache в начальных конфигурациях. Для этого сначала произведем установку:
```
sudo apt install apache2
```
*Apache1 является более старой версией, основанной на другом веб-сервере. Apache2 имеет уже свою собственную архитектуру*

Теперь используем утилиту *service* чтобы посмотреть состояние службы

И запустим службу через нее же

Теперь, если перейти в браузер и вбить в поисковой строке
```
http://127.0.0.1
```
мы увидим стартовую страницу Apache

Если же остановить службу и перезагрузить страницу, получить доступ до начальной страницы Apache уже не получится

Включим сервис обратно
Однако сервис не будет работать, если Linux будет перезагружен. Для того чтобы внести Apache в автозагрузку, используем *systemctl*
```
sudo systemctl enable apache2
```

Если будет нужно, сервис можно убрать из автозагрузки

2. Telnet
Сетевой протокол для реализации терминального интерфейса по сети. Фактически - дает возможность удаленного управления устройствами. Раньше для этих целей и использовался, но на смену ему пришел протокол SSH, который защищает передаваемые данные и команды (в отличие от Telnet).
В Linux Telnet представляет из себя две службы: клиентская и серверная. Они позволяют работать по сети по протоколу Telnet. Клиентская служба позволяет подключаться к серверам, а также прослушивать порты на IP адресах, что можно использовать в пинтесте. Серверная часть предоставляет удаленный доступ до консоли сервера.
Для начала протестируем возможности клинетской части. Т.к. Telnet не всегда поставляется в дистрибутивах, сначала установим его

После установки можно использовать возможности клиентской службы. Для начала попробуем подключиться по telnet к какому-нибудь сайту (по его доменному имени) (для этого используем порт 80, использующийся для протокола HTTP). Как только у нас появится возможность, введем ключ `GET /` чтобы получить веб-страницу по данному IP адресу

В консоли Linux появится веб-страница в формате HTML
Теперь попробуем подключиться к нашей же Linux через протокол SSH (использовать его в полной мере не получится, зато откроется консоль для работы через сам протокол telnet, то что консоль появилась, означает то, что SSH прослушивает порт, по которому мы обращаемся).
```
telnet -d <ip addr> 22
```

Теперь попробуем использовать сервер Telnet. Установим пакеты для сервера с помощью команды
```
sudo apt install telnetd
```

А теперь попробуем подключиться к серверу через клиентскую часть (не забывать, что Telnet работает на порту 23)

Если мы посмотрим на приходящие и исходящие пакеты через wireshark, то увидим, что Telnet отсылает введенные нами данные в открытом виде по одному символу (что не является безопасным)

3. SSH
SSH рассматривался и в других работах. Повторим еще раз его основные особенности.
SSH - протокол передачи данных по зашифрованному каналу, исключающий большое количетсво возможных атак для получения данных. В частности, используется для передачи текстовых команд для организвации удаленного управления устройствами. В Linux есть сервис, аналогично Telnet, позволяющий как создавать подключения, так и принимать их. Примечательной особенностью является использование публичных ключей при аутентификации пользователя на сервере.
Контролировать данные и возможные типы аутентификации (а также относящиеся к ним алгоритмы) возможно с помощью конфигурационного файла **/etc/ssh/ssh_config**

Контроль же за серверной частью осуществляется в файле **/etc/ssh/sshd_config** (в нем также можно контролировать весь процесс аутентификации, а также порт и ip-адрес подключения к серверу).
Отметим возможность проверки состояния конфигурационных файлов, чтобы не искать ошибку самостоятельно:
```
sudo sshd -t
```
Если в файле допущена ошибка, команда выведет место ошибки:

4. FTP
Это протокол передачи файлов по сети (является одним из первых протоколов). Передает файлы, но никак не шифрует трафик, а также является неудобным для построения приложений на нем, поэтому сейчас почти не используется и даже не поддерживается современными версиями браузеров (на смену пришли возможности SSH вместе с SFTP).
Протокол основан на клиент-серверной архитектуре сети. Для того, чтобы можно было использовать машину в качестве FTP сервера, нужно установить сервис, который организует взаимодействие по FTP. Далее клиенты смогут подключиться к серверу через IP адрес и производить простейшее управление файловой системой на сервере. Для управления используется командный интерфейс. Команды включают в себя управление файлами и каталогами (по одному), просмотр и перемещение между каталогами, а также команды для скачивания \ загрузки файлов.
На современных дистрибутивах работу с FTP и его более безопасной версией FTPS осуществляет сервис *vsftpd*. Этот сервис пытается исправить большое количество ошибок протокола. Испоьлзуем его для работы с FTP. Для начала установим его, если он не включен в дистрибутив
```
sudo apt install vsftpd
```

Далее проверим состояние сервиса (должен быть запущен)

После чего добавим сервис в автозагрузку

Для контроля работы сервиса используется конфигурационный файл */etc/vsftpd.conf*
Основные опции:
+ listen - говорит о типе прослушиваемого vsftpd адреса: IPv4
+ listen_ipv6 - говорит об адресах IPv6. Взаимоисключает значение флага listen. Для запуска двух разных типов прослушивания требуется запуск двух процессов vsftp
+ anonymous_enable - разрешение входа анонимно. Если разрешено, имена *ftp* и *anonymous* будут использоваться для анонимного входа
+ local_enable - разрешение использования для аутентификации локальной базы пользователей из /etc/passwd
+ dimmesage_enable - разрешение показывать сообщения пользователям при переходе в каталог. Сообщение берется из файла, на который указывает опция *message_file*
+ xferlog_enable - разрешение логирования всех скачиваний и загрузок на сервер (путь сохранения логов: /var/log/vsftpd.log)
+rsa_cert_file - путь в файловой системе до файлов RSA-ключей, использующихся в SSL-сертификации для обеспечения защиты.
+ chroot_local_user - разрешение доступа к домашнему каталогу пользователя.

Оставим настройки по-умолчанию и перейдем в клиент FileZilla чтобы подключиться по FTP к Linux. Т.к. мы используем старые возможности, FileZilla оповестит нас о том, что это небезопасно

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

В то же врем, если посмотреть на лог прослушивания портов в Wireshark, мы увидим, что данные нашего пользователя передавались без какой-либо защиты

5. SMB
В корпоративную инфраструктуру, основанную на Microsoft Active Directory достаточно сложно включить Unix-машины, т.к обеспечить удобный и прозрачный доступ до Unix-систем с Windows тяжело. Но т.к. такой доступ бывает нужным организовать, была создана утилита **samba**, позволяющая Linux-системам имитировать Windows. Samba основана на протоколе smb, который используется в Windows для обращения и работы с общими ресурсами. Сервис samba на Linux позволяет организовать доступ к файловой системе для Windows-систем, а также доступ до принтеров. Последние версии Samba уже способны организовать контроллеры домена.
Используем Samba для организации файлового сервера на основе Linux.
Сначала установим пакеты утилиты (могут входить в начальную конфигурацию дистрибутива):
```
sudo apt install samba
```

Теперь перейдем в конфигурационный файл Samba
```
sudo nano /etc/samba/smb.conf
```
Здесь нам нужно объявить папку, которая будет доступна на файловом сервере. Переходим в конец файла и добавляем следующий текст:

Опишем прописанные конфигурации:
+ [] - указывает имя папки, которое будет использоваться для доступа
+ comment - комментарий для удобства
+ browsable - видимая или невидимая папка
+ path - путь на севере до папки, которая будет расшерена (здесь: /tmp)
+ guest ok - разрешение доступа к папке с гостевой учетной записи
+ read only - доступ только для чтения. Не позволяет пользователям создавать папки
+ creat/directory mask - создание папок и файлов происходит с группой прав, установленной в значениях эти полей. 0777 - выдача разрешений на чтение-запись-исполнение всеми пользователями
+ force creat/directory mode - установка значений доступа вне зависимости от тех, которыми обладает загружаемый файл.
Теперь проверим корректность настройки с помощью утилиты *testparm*
После чего запустим сервис samba и добавим его в автозагрузку
```
sudo systemctl enable smbd
sudo systemctl start smbd
```
Теперь, если перейти в проводник Windows, набрать IP-адрес Linux-сервера и имя папки в таком формате: `\\<ip-addr>\<folder>`, то у нас получится зайти в папку /tmp, указанную при настройке шеринга папки в конфигурационном файле Samba

Попробуем создать какой-то файл с запущенным на прослушивание Wireshark на Linux


Протокол предполагает отсылку запросов на выполнение действий.