# Linux Basics Модуль Занятие 3 ## Сервисы Linux ### Практическая работа 3.1 Cron Cron - специальная демон-программа, которая может вызывать в специально определенное время заранее написанные скрипты и таким образом автоматизировать процесс работы на машинах Linux. Все задачи в cron записываются в специальный существующий для каждого пользователя отдельно файл через утилиту crontab, после чего демон cron раз в минуту просматривает полученную таблицу и выполняет команды, когда время для их выполнения подошло. Основные возможности команды crontab: + посмотреть имеющиеся запланированные действия: `crontab -l` + редактирование таблицы: `crontab -e` (также можно указать `-u username` чтобы редактировать таблицу другого пользователя, но *требуются права суперпользователя*) ![](https://i.imgur.com/R4XjWgM.png) + удаление файла с таблицей: `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ю ![](https://i.imgur.com/MYOLbhO.png) Добавление нового пользователя через `adduser` автоматически создает не только пользователя, но и группу для него. Проверим это, посмотрев группы созданного пользователя ![](https://i.imgur.com/0atE8Bq.png) 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. ![](https://i.imgur.com/FZcGHPX.png) После прописывания всех настроек, сохранить и закрыть файл. 1.3 Применяем настройки для sshd процесса: ``` sudo systemctl restart ssh ``` ![](https://i.imgur.com/tMP0VVb.png) На этом сервер Linux с доступом по SFTP настроен. 1.4 Проверка возможности входа Для проверки возможности входа на сервер с Windows, попробуем утилиту WinSCP. Скачать можно по [ссылке](https://sourceforge.net/projects/winscp/). Устанавливаем и запускаем утилиту. Нас встретит окно данными, которые будут использоваться для входа на удаленный сервер. Нужно выбрать протокол передачи (SFTP), ввести ip-адрес Linux-сервера, порт входа (по умолчанию 22), а также данные созданного в пункте 1.1 пользователя. ![](https://i.imgur.com/ZgYxwv6.png) После нажатия кнопки войти нам будет доступна файловая система Linux-сервера с уровня /home. ![](https://i.imgur.com/FW6jLO9.png) 1.5 Использование для входа утилиты FileZilla ([ссылка для скачивания](https://filezilla.ru/get/)) Здесь чтобы организовать подключение, нужно также, как и в WinSCP ввести данные сервера и пользователя. Для выбора протокола нужно использовать синтаксис вида `sftp://ip-адрес` ![](https://i.imgur.com/JqySfuc.png) После нажатия кнопки *Быстрое соединение* нам будет доступна файловая система на Linux-сервере. ![](https://i.imgur.com/q3vv6oX.png) 1.6 Использование терминала для взаимодейтсвия с SFTP-сервером. При таком способе взаимодействия мы не можем выполнять команд, основанных на возможностях оболочки, и не можем вызывать другие программы. Нам доступно только взаимодействие с файловой системой. Для подключения нужно использовать утилиту sftp. Использование схоже с использованием ssh: ``` sftp <user>@<host> ``` ![](https://i.imgur.com/kXagHkA.png) ![](https://i.imgur.com/ZABlhix.png) После подключения будет доступна консоль sftp. Через нее мы можем посмотреть, что хранится в каталоге, загрузить папку или другие дейсствия, которые выполняются с папками и файлами. Загрузим какой-то каталог с помощью команды *put* в доступную нам облась (нам доступен только каталог созданного пользователя) ![](https://i.imgur.com/sRJxaKp.png) После можем посмотреть, что он загружен на сервер ![](https://i.imgur.com/xW1Ie9W.png) А теперь скачаем файл с помощью команды *put* ![](https://i.imgur.com/cNa2bQ7.png) 1.7 Анализ трафика при использовании протокола SFTP Т.к. протокол SFTP работает на основе протокола SSH, и использует создаваемый в SSH шифрованный тунель, то и данные, которые отправляет сервер клиенту или наоборот, будут проходить по тунелю SSH. Проверим это: запустим на Linux утилиту Wireshark и зайдем на сервер через протокол SFTP и утилиту FileZilla ![](https://i.imgur.com/D0qi3Gf.png) Как мы видим, клиент и сервер обмениваются данными на основе проткола SSH версии 2 при совершении любых действий на удаленном сервер через FileZilla. Для установки работы протокола сначала отправляются TCP пакеты, которые устанавливают TCP сессию. После происходит передача файлов уже в зашифрованном виде, и отпечаток этих данных можно посмотреть в пакетах SSH. ![](https://i.imgur.com/W0I7ob5.png) ### Практическая работа 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 ``` ![](https://i.imgur.com/8Ryy7w7.png) Дерево же всех запущенных процессов можно посмотреть через systemctl: ``` systemctl status ``` ![](https://i.imgur.com/o9lZ4ks.png) Перейдем к исследованию сервисов: 1. Apache Кроссплатформенный сервис для создания веб-серверов, основанный на модульной архитектуре. БольшАя часть всех сайтов в Интернете работает на Apache. При этом сервис разрабатывается некомерческой организацией и поддерживается не частной компанией, а сообществом (и поэтому является бесплатным). Попробуем посмотреть, как будет выглядеть Apache в начальных конфигурациях. Для этого сначала произведем установку: ``` sudo apt install apache2 ``` *Apache1 является более старой версией, основанной на другом веб-сервере. Apache2 имеет уже свою собственную архитектуру* ![](https://i.imgur.com/eZ6FFBB.png) Теперь используем утилиту *service* чтобы посмотреть состояние службы ![](https://i.imgur.com/T9EoZzo.png) И запустим службу через нее же ![](https://i.imgur.com/a1yZh7X.png) Теперь, если перейти в браузер и вбить в поисковой строке ``` http://127.0.0.1 ``` мы увидим стартовую страницу Apache ![](https://i.imgur.com/pVKmFFK.png) Если же остановить службу и перезагрузить страницу, получить доступ до начальной страницы Apache уже не получится ![](https://i.imgur.com/VpKGPUM.png) Включим сервис обратно Однако сервис не будет работать, если Linux будет перезагружен. Для того чтобы внести Apache в автозагрузку, используем *systemctl* ``` sudo systemctl enable apache2 ``` ![](https://i.imgur.com/64mS66y.png) Если будет нужно, сервис можно убрать из автозагрузки ![](https://i.imgur.com/UiAVUKv.png) 2. Telnet Сетевой протокол для реализации терминального интерфейса по сети. Фактически - дает возможность удаленного управления устройствами. Раньше для этих целей и использовался, но на смену ему пришел протокол SSH, который защищает передаваемые данные и команды (в отличие от Telnet). В Linux Telnet представляет из себя две службы: клиентская и серверная. Они позволяют работать по сети по протоколу Telnet. Клиентская служба позволяет подключаться к серверам, а также прослушивать порты на IP адресах, что можно использовать в пинтесте. Серверная часть предоставляет удаленный доступ до консоли сервера. Для начала протестируем возможности клинетской части. Т.к. Telnet не всегда поставляется в дистрибутивах, сначала установим его ![](https://i.imgur.com/3ZIGDtA.png) После установки можно использовать возможности клиентской службы. Для начала попробуем подключиться по telnet к какому-нибудь сайту (по его доменному имени) (для этого используем порт 80, использующийся для протокола HTTP). Как только у нас появится возможность, введем ключ `GET /` чтобы получить веб-страницу по данному IP адресу ![](https://i.imgur.com/6bICGWy.png) В консоли Linux появится веб-страница в формате HTML Теперь попробуем подключиться к нашей же Linux через протокол SSH (использовать его в полной мере не получится, зато откроется консоль для работы через сам протокол telnet, то что консоль появилась, означает то, что SSH прослушивает порт, по которому мы обращаемся). ``` telnet -d <ip addr> 22 ``` ![](https://i.imgur.com/xLRDOq7.png) Теперь попробуем использовать сервер Telnet. Установим пакеты для сервера с помощью команды ``` sudo apt install telnetd ``` ![](https://i.imgur.com/L3XDRxM.png) А теперь попробуем подключиться к серверу через клиентскую часть (не забывать, что Telnet работает на порту 23) ![](https://i.imgur.com/uf2JwDv.png) Если мы посмотрим на приходящие и исходящие пакеты через wireshark, то увидим, что Telnet отсылает введенные нами данные в открытом виде по одному символу (что не является безопасным) ![](https://i.imgur.com/Ki4mv9b.png) 3. SSH SSH рассматривался и в других работах. Повторим еще раз его основные особенности. SSH - протокол передачи данных по зашифрованному каналу, исключающий большое количетсво возможных атак для получения данных. В частности, используется для передачи текстовых команд для организвации удаленного управления устройствами. В Linux есть сервис, аналогично Telnet, позволяющий как создавать подключения, так и принимать их. Примечательной особенностью является использование публичных ключей при аутентификации пользователя на сервере. Контролировать данные и возможные типы аутентификации (а также относящиеся к ним алгоритмы) возможно с помощью конфигурационного файла **/etc/ssh/ssh_config** ![](https://i.imgur.com/nJyG5Y9.png) Контроль же за серверной частью осуществляется в файле **/etc/ssh/sshd_config** (в нем также можно контролировать весь процесс аутентификации, а также порт и ip-адрес подключения к серверу). Отметим возможность проверки состояния конфигурационных файлов, чтобы не искать ошибку самостоятельно: ``` sudo sshd -t ``` Если в файле допущена ошибка, команда выведет место ошибки: ![](https://i.imgur.com/Zd5invo.png) 4. FTP Это протокол передачи файлов по сети (является одним из первых протоколов). Передает файлы, но никак не шифрует трафик, а также является неудобным для построения приложений на нем, поэтому сейчас почти не используется и даже не поддерживается современными версиями браузеров (на смену пришли возможности SSH вместе с SFTP). Протокол основан на клиент-серверной архитектуре сети. Для того, чтобы можно было использовать машину в качестве FTP сервера, нужно установить сервис, который организует взаимодействие по FTP. Далее клиенты смогут подключиться к серверу через IP адрес и производить простейшее управление файловой системой на сервере. Для управления используется командный интерфейс. Команды включают в себя управление файлами и каталогами (по одному), просмотр и перемещение между каталогами, а также команды для скачивания \ загрузки файлов. На современных дистрибутивах работу с FTP и его более безопасной версией FTPS осуществляет сервис *vsftpd*. Этот сервис пытается исправить большое количество ошибок протокола. Испоьлзуем его для работы с FTP. Для начала установим его, если он не включен в дистрибутив ``` sudo apt install vsftpd ``` ![](https://i.imgur.com/VSRJkuO.png) Далее проверим состояние сервиса (должен быть запущен) ![](https://i.imgur.com/mkWYeCq.png) После чего добавим сервис в автозагрузку ![](https://i.imgur.com/ea4qGpw.png) Для контроля работы сервиса используется конфигурационный файл */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 - разрешение доступа к домашнему каталогу пользователя. ![](https://i.imgur.com/zp91u71.png) Оставим настройки по-умолчанию и перейдем в клиент FileZilla чтобы подключиться по FTP к Linux. Т.к. мы используем старые возможности, FileZilla оповестит нас о том, что это небезопасно ![](https://i.imgur.com/4P8Ae7h.png) Проигнорируем предупреждение и подключимся к серверу. У нас появится доступ к домашнему каталогу пользователя. данные которого были введены ![](https://i.imgur.com/UpALQPj.png) В то же врем, если посмотреть на лог прослушивания портов в Wireshark, мы увидим, что данные нашего пользователя передавались без какой-либо защиты ![](https://i.imgur.com/CmhTBI2.png) 5. SMB В корпоративную инфраструктуру, основанную на Microsoft Active Directory достаточно сложно включить Unix-машины, т.к обеспечить удобный и прозрачный доступ до Unix-систем с Windows тяжело. Но т.к. такой доступ бывает нужным организовать, была создана утилита **samba**, позволяющая Linux-системам имитировать Windows. Samba основана на протоколе smb, который используется в Windows для обращения и работы с общими ресурсами. Сервис samba на Linux позволяет организовать доступ к файловой системе для Windows-систем, а также доступ до принтеров. Последние версии Samba уже способны организовать контроллеры домена. Используем Samba для организации файлового сервера на основе Linux. Сначала установим пакеты утилиты (могут входить в начальную конфигурацию дистрибутива): ``` sudo apt install samba ``` ![](https://i.imgur.com/ZoHEMyV.png) Теперь перейдем в конфигурационный файл Samba ``` sudo nano /etc/samba/smb.conf ``` Здесь нам нужно объявить папку, которая будет доступна на файловом сервере. Переходим в конец файла и добавляем следующий текст: ![](https://i.imgur.com/1unNweL.png) Опишем прописанные конфигурации: + [] - указывает имя папки, которое будет использоваться для доступа + 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 ![](https://i.imgur.com/SMOUyU8.png) Попробуем создать какой-то файл с запущенным на прослушивание Wireshark на Linux ![](https://i.imgur.com/OMLZGOq.png) ![](https://i.imgur.com/yFCTxzZ.png) Протокол предполагает отсылку запросов на выполнение действий.