«Golang - библиотека начинающего» и «FTP-сервер с виртуальными пользователями на базе vsftpd»: разница между страницами

Материал из support.qbpro.ru
(Различия между страницами)
imported>Vix
Нет описания правки
 
imported>Vix
Нет описания правки
 
Строка 1: Строка 1:
'''ПОЛЕЗНОЕ:'''
''Автор: Уваров А.С. 29.01.2016''<br>
<hr>
[[Файл:Vsftpd-virtual-user-000.jpg]]<br>
* [https://zen.yandex.ru/media/id/5efb9e12db3fe6783a97047a/ustanavlivaem-redaktor-koda-vscodium-v-linux-5f63bb7dbdfa745d40a63cb7 Устанавливаем VSCodium в Ubuntu/Debian]
Протокол FTP, несмотря на преклонный возраст и серьезные недостатки продолжает широко применяться, во многом благодаря простоте и поддержке со стороны самого широкого спектра устройств и ПО. FTP-сервер является неотъемлемой частью любого веб-сервера, применяется в системах автоматизированного обмена данными. Наиболее часто встающей перед администраторами таких систем задачей является создание сервера с виртуальными пользователями. Сегодня мы расскажем, как это сделать.
* [https://golangs.org/ Уроки для изучения Golang]
 
* [https://metanit.com/go/tutorial/1.1.php Введение в язык Go]
Про настройку FTP-сервера на базе vsftpd мы уже рассказывали на страницах нашего сайта, недавно существенно дополнив и обновив статью Простой FTP-сервер на базе Ubuntu (vsftpd). В ней мы рассказали каким образом можно ограничить список пользователей, имеющих возможность подключаться к серверу, и их права. Однако локальные пользователи остаются при этом локальными пользователями и несмотря на ограниченные права могут оказаться объектом атаки, направленной на повышение прав, например, через уязвимости в каком-либо ПО.
* [https://metanit.com/go/tutorial/2.11.php Функции и их параметры]
 
* [https://www.ibm.com/developerworks/ru/library/l-go_01/ Язык программирования go]
Кроме того, ручное редактирование списков и настроек пользователей может оказаться весьма трудоемким делом если их не один-два, а существенно больше. Также иногда возникает ситуация, что светить данные реальных пользователей просто нежелательно, например, FTP используется движком сайта (CMS), связка пользователь-пароль явно прописана в конфиге и теоретически доступна любому работающему с сайтом сотруднику.
* [https://tproger.ru/translations/golang-basics/ Golang: основы для начинающих]
 
* [http://golang-book.ru/ Введение в программирование на Go]
В таких ситуациях следует использовать виртуального пользователя, который будет иметь доступ исключительно к данному FTP-ресурсу и учетные данные которого можно смело сообщить всем принимающих участие в работе реальным сотрудникам.
* [https://medium.com/golang-notes/%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-visual-studio-code-%D0%B4%D0%BB%D1%8F-go-647ea94aa795 Настройка Visual Studio Code для Go]
 
* [https://serverspace.by/support/help/ustanovka-go-na-windows-server/ Установка GoLang на Windows Server]
В нашей статье мы настроим FTP-сервер для реализации следующей схемы:
* [https://otus.ru/nest/post/1015/ GOPATH и GOROOT больше не нужны?]
 
* [https://nuancesprog.ru/p/5966/ Идеальная настройка вашего Golang проекта]
[[vsftpd-virtual-user-001.jpg]]<br>
* [https://habr.com/ru/post/249449/ Кросс-компиляция в Go]
Пусть в нашем распоряжении имеется некий веб-сервер под управлением которого находятся три сайта: blue.lab, green.lab и red.lab, физически расположенные в одноименных директориях. Наша задача создать FTP-сервер с виртуальными пользователями, каждый из которых имеет доступ только к своему сайту.
* [https://gobyexample.com/ Go by Example]
 
* [https://golang.org/pkg/ Golang Packages]
Важное замечание, в данной схеме все сайты должны работать от имени веб-сервера (www-data), если вы используете запуск каждого сайта от имени своего (реального) пользователя, то вам лучше настроить FTP-сервер для работы с реальными пользователями или дополнительно обеспечить нужные права доступа для виртуальных пользователей, что может представлять из себя нетривиальную задачу.
* [https://golang-blog.blogspot.com/2019/06/go-specification-variadic-parameters.html Спецификация Go: передача аргументов в ... параметрах ]
 
* [https://medium.com/nuances-of-programming/%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC-%D1%81-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0%D0%BC%D0%B8-golang-8518b960312 Интерфейсы в Golang]
Прежде всего установим соглашение: имя виртуального пользователя должно совпадать и именем корневой FTP-папки, в нашем случае папки сайта, а все такие папки должны располагаться в одном месте, т.е. подпадать под шаблон /var/www/$USER. Это позволит в дальнейшем с легкостью манипулировать сайтами и виртуальными пользователями, а также избежать путаницы в именах и настройках.
* [https://rtfm.co.ua/books-translations/go-s-nulya/go-chast-9-funkcii/ Go: часть 9 — функции]
 
<hr>
Определившись с моделью размещения данных можно переходить к настройкам ПО. Кроме vsftpd нам понадобятся пакеты libpam-pwdfile и apache2-utils. Последний входит в состав одноименного веб-сервера и если у вас уже работает Apache, то устанавливать его не надо.
* [https://ru.stackoverflow.com/questions/1038138/%D0%9A%D0%B0%D0%BA-%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E-%D0%BF%D1%80%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E%D1%89%D1%83%D1%8E-%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D0%B5-%D1%82%D0%B8%D0%BF%D1%8B-%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2 Как описать функцию, принимающую разные типы аргументов?]
 
* [https://rtfm.co.ua/golang-go-in-practice-zametki-na-polyax-chast-1-vvedenie/ Golang: Go in Practice — заметки на полях, часть 1 — введение]
Сама установка предельно проста:
* [https://atonko.ru/?p=351 Сайт на Golang. Часть 2. Работаем с HTML]
 
* [https://golang-blog.blogspot.com/2020/04/measure-execution-time-in-golang.html?ysclid=l2v2i8i5et Измерение времени исполнения в Golang ]
apt-get install vsftpd libpam-pwdfile apache2-utils
После чего перейдем к настройкам FTP-сервера, которые расположены в файле /etc/vsftpd.conf, мы перечислим опции в порядке их нахождения в файле.
 
Данная опция запускает FTP-сервер как службу
 
listen=YES
ниже имеется аналогичная взаимоисключающая опция:
 
listen_ipv6=NO
Первая из них обеспечивает поддержку IPv4, вторая сразу IPv6 и IPv4, поэтому должна быть включена только одна из них.
 
Запрещаем анонимных пользователей:
 
anonymous_enable=NO
И разрешаем локальных (и виртуальных) пользователей:
 
local_enable=YES
Также разрешаем запись:
 
write_enable=YES
и задаем маску для вновь создаваемых файлов и папок:
 
local_umask=022
Это обеспечит установку прав 755 на папки и 644 на файлы, т.е. полный доступ только владельцу и чтение для группы и остальных.
 
Чтобы FTP использовал локальное время сервера, а не GMT установим:
 
use_localtime=YES
И включим лог загружаемых и скачиваемых файлов:
 
xferlog_enable=YES
Разрешаем передачу данных через порт 20, требуется для лучшей совместимости с некоторыми клиентами:
 
connect_from_port_20=YES
Задаем путь к логу и его формат:
 
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES
Укажем таймауты:
 
idle_session_timeout=600
data_connection_timeout=120
Первый задает время отключения бездействующего пользователя, а второй время ожидания возобновления неоконченной передачи.
 
Для корректной работы с текстовыми данными, в частности с символами переноса строки в разных ОС (CR+LF в Windows, LF в Linux) включим поддержку ASCII, это полезно, если вы скачиваете скрипты или файлы с Linux сервера, правите их в среде Windows и заливаете обратно. В этом случае FTP автоматически будет менять символы переноса строки для соответствия стандартам системы.
 
ascii_upload_enable=YES
ascii_download_enable=YES
Обязательно изолируем пользователя в корне его домашней директории и рядом впишем опцию, разрешающую запись в корень:
 
chroot_local_user=YES
allow_writeable_chroot=YES
Остальные опции оставляем без изменения.
 
Ниже добавим необходимые нам настройки. Разрешим пассивный режим и явно укажем диапазон портов:
 
pasv_enable=YES
pasv_min_port=62000
pasv_max_port=62999
Включим виртуальных пользователей:
 
guest_enable=YES
Укажем от имени какого реального пользователя они будут работать, так как в нашем случае нам надо работать с содержимым веб-сервера, то указываем соответствующего пользователя www-data.
 
guest_username=www-data
Применяем к виртуальным пользователям настройки локальных, иначе к ним будут применены ограничения анонимных.
 
virtual_use_local_privs=YES
Укажем шаблон для автоматической генерации домашнего каталога виртуального пользователя:
 
user_sub_token=$USER
Теперь можно задать сами домашние директории
 
local_root=/var/www/$USER
Также иногда неплохо будет скрыть реальных владельцев содержимого, для этого добавьте:
 
hide_ids=YES
Если вы используете Ubuntu, то добавьте следующую недокументированную опцию:
 
seccomp_sandbox=NO
Это позволит избежать ошибки 500 OOPS: prctl PR_SET_SECCOMP failed, которая возникает из некорректной совместной работы vsftpd и системы безопасности seccomp, в Debian данная ошибка не проявляется.
 
На этом настройка FTP-сервера закончена, сохраняем файл и переходим к настройке правил аутентификации. Откроем /etc/pam.d/vsftpd, закомментируем в нем все строки и добавим две свои:
 
auth required pam_pwdfile.so pwdfile /etc/vsftpwd
account required pam_permit.so
После этого аутентификация локальных пользователей на FTP-сервере будет невозможна, работать будут только виртуальные. Опция pwdfile /etc/vsftpwd указывает путь к файлу паролей, его нам необходимо будет создать на следующем шаге.
 
Для создания пользователей будем использовать утилиту htpasswd из состава apache2-utils, для создания файла паролей и первого пользователя введите:
 
htpasswd -c -d /etc/vsftpwd blue.lab
Ключ -c предписывает создать файл паролей, если он существует, то все данные в нем будут очищены, а файл перезаписан, -d задает необходимый для vsftpd алгоритм шифрования хэша пароля.
 
Следующие пользователи создаются командой (в нашем примере это пользователь green.lab):
 
htpasswd -d /etc/vsftpwd green.lab
Для удаления пользователя используйте (удаляем red.lab):
 
htpasswd -D /etc/vsftpwd red.lab
После чего можно перезапустить службу FTP-сервера и проверить его работу:
 
service vsftpd restart
Как видим, настроить FTP-сервер с виртуальными пользователями по нашей инструкции (в отличие от многих иных "инструкций" в сети) абсолютно несложно и недолго. Если вы будете внимательно следовать всем нашим рекомендациям, то сложностей у вас возникнуть не должно.


'''ТЕКУЧКА:'''
'''ИСТОЧНИК:'''
<hr>
* [https://golangs.org/goroutines Горутины и конкурентность — Многопоточность в Go]
* [https://golang-blog.blogspot.com/2019/06/go-specification-variadic-parameters.html Спецификация Go: передача аргументов в ... параметрах]
* [https://medium.com/nuances-of-programming/%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC-%D1%81-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0%D0%BC%D0%B8-golang-8518b960312 Полиморфизм с интерфейсами в Golang]
* [https://ru.stackoverflow.com/questions/1038138/%D0%9A%D0%B0%D0%BA-%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D1%82%D1%8C-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8E-%D0%BF%D1%80%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E%D1%89%D1%83%D1%8E-%D1%80%D0%B0%D0%B7%D0%BD%D1%8B%D0%B5-%D1%82%D0%B8%D0%BF%D1%8B-%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2 Как описать функцию, принимающую разные типы аргументов?]
* [https://rtfm.co.ua/golang-go-in-practice-zametki-na-polyax-chast-1-vvedenie/ Golang: Go in Practice — заметки на полях, часть 1 — введение]
* [https://habr.com/ru/post/351060/ Пишем Telegram-бота на Go для поиска в Википедии]
* [https://medium.com/golang-notes/%D0%BF%D0%B8%D1%88%D0%B5%D0%BC-%D0%B1%D0%BE%D1%82%D0%B0-%D0%B4%D0%BB%D1%8F-telegram-%D0%BD%D0%B0-go-71c9acd102d1 Пишем бота для Telegram на Go]
* [https://4te.me/post/telegram-bot-golang/ Как написать Telegram бота на Golang]
* [https://ashirobokov.wordpress.com/2016/10/04/dnd-spells-telegram-bot-1/ Как я Telegram бота на Go писал. Часть первая. Начало.]
* [https://habr.com/ru/post/475390/ Как создать свое первое веб-приложение с помощью Go]
* [https://gist.github.com/hyg/9c4afcd91fe24316cbf0 open browser in golang]
* [https://fooobar.com/questions/1623704/go-language-automation-how-use-selenium-like-browser-automation Автоматизация в Go Lang - Как использовать автоматизацию браузера, как Selenium?]
* [https://tproger.ru/translations/go-web-server/ Разработка веб-серверов на Go]
* [http://www.x-scripts.com/%D1%81%D1%82%D0%B0%D1%82%D1%8C%D0%B8/%D1%8D%D0%BC%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F/ Эмуляция действий пользователя на странице]
* [https://codeby.net/threads/golang-pishem-programmu-dlja-udaljonnogo-upravlenija-vstroennym-interpretatorom.67873/ Golang - Пишем программу для удалённого управления встроенным интерпретатором]
* [https://fokusov.com/posts/razrabotka-web-prilozhenij-i-mikroservisov-na-golang-s-gin Разработка Web-приложений и микросервисов на Go с Gin]
* [https://temofeev.ru/info/articles/razrabotka-veb-serverov-na-golang-ot-prostogo-k-slozhnomu/ Разработка веб-серверов на Golang — от простого к сложному]
* [https://4gophers.ru/articles/avtorizaciya-v-go-s-ispolzovaniem-jwt/ Авторизация в Go с использованием JWT]
* [https://golang-blog.blogspot.com/p/go-web-app.html Веб-приложение на Go]
* [https://metanit.com/go/tutorial/10.4.php SQLite в Go]
<hr>
<hr>
* [https://beego.me/docs/intro/ Framework beego.me]
* [https://interface31.ru/tech_it/2016/01/nastraivaem-ftp-server-s-virtual-nymi-pol-zovatelyami-na-baze-vsftpd.html Записки IT специалиста]
* [https://github.com/avelino/awesome-go#web-frameworks Awesome Go]
* [https://medium.com/devtechtoday/top-7-golang-web-frameworks-in-2020-and-beyond-9ca2a89eb904 Top 7 Golang Web Frameworks In 2020 And Beyond]
* [https://coderlessons.com/articles/programmirovanie/go-sozdanie-veb-prilozhenii-s-beego https://coderlessons.com/articles/programmirovanie/go-sozdanie-veb-prilozhenii-s-beego]
* [https://habr.com/ru/post/444022/ Beego — это уже не Go]

Версия от 02:20, 13 декабря 2020

Автор: Уваров А.С. 29.01.2016
Vsftpd-virtual-user-000.jpg
Протокол FTP, несмотря на преклонный возраст и серьезные недостатки продолжает широко применяться, во многом благодаря простоте и поддержке со стороны самого широкого спектра устройств и ПО. FTP-сервер является неотъемлемой частью любого веб-сервера, применяется в системах автоматизированного обмена данными. Наиболее часто встающей перед администраторами таких систем задачей является создание сервера с виртуальными пользователями. Сегодня мы расскажем, как это сделать.

Про настройку FTP-сервера на базе vsftpd мы уже рассказывали на страницах нашего сайта, недавно существенно дополнив и обновив статью Простой FTP-сервер на базе Ubuntu (vsftpd). В ней мы рассказали каким образом можно ограничить список пользователей, имеющих возможность подключаться к серверу, и их права. Однако локальные пользователи остаются при этом локальными пользователями и несмотря на ограниченные права могут оказаться объектом атаки, направленной на повышение прав, например, через уязвимости в каком-либо ПО.

Кроме того, ручное редактирование списков и настроек пользователей может оказаться весьма трудоемким делом если их не один-два, а существенно больше. Также иногда возникает ситуация, что светить данные реальных пользователей просто нежелательно, например, FTP используется движком сайта (CMS), связка пользователь-пароль явно прописана в конфиге и теоретически доступна любому работающему с сайтом сотруднику.

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

В нашей статье мы настроим FTP-сервер для реализации следующей схемы:

vsftpd-virtual-user-001.jpg
Пусть в нашем распоряжении имеется некий веб-сервер под управлением которого находятся три сайта: blue.lab, green.lab и red.lab, физически расположенные в одноименных директориях. Наша задача создать FTP-сервер с виртуальными пользователями, каждый из которых имеет доступ только к своему сайту.

Важное замечание, в данной схеме все сайты должны работать от имени веб-сервера (www-data), если вы используете запуск каждого сайта от имени своего (реального) пользователя, то вам лучше настроить FTP-сервер для работы с реальными пользователями или дополнительно обеспечить нужные права доступа для виртуальных пользователей, что может представлять из себя нетривиальную задачу.

Прежде всего установим соглашение: имя виртуального пользователя должно совпадать и именем корневой FTP-папки, в нашем случае папки сайта, а все такие папки должны располагаться в одном месте, т.е. подпадать под шаблон /var/www/$USER. Это позволит в дальнейшем с легкостью манипулировать сайтами и виртуальными пользователями, а также избежать путаницы в именах и настройках.

Определившись с моделью размещения данных можно переходить к настройкам ПО. Кроме vsftpd нам понадобятся пакеты libpam-pwdfile и apache2-utils. Последний входит в состав одноименного веб-сервера и если у вас уже работает Apache, то устанавливать его не надо.

Сама установка предельно проста:

apt-get install vsftpd libpam-pwdfile apache2-utils

После чего перейдем к настройкам FTP-сервера, которые расположены в файле /etc/vsftpd.conf, мы перечислим опции в порядке их нахождения в файле.

Данная опция запускает FTP-сервер как службу

listen=YES

ниже имеется аналогичная взаимоисключающая опция:

listen_ipv6=NO

Первая из них обеспечивает поддержку IPv4, вторая сразу IPv6 и IPv4, поэтому должна быть включена только одна из них.

Запрещаем анонимных пользователей:

anonymous_enable=NO

И разрешаем локальных (и виртуальных) пользователей:

local_enable=YES

Также разрешаем запись:

write_enable=YES

и задаем маску для вновь создаваемых файлов и папок:

local_umask=022

Это обеспечит установку прав 755 на папки и 644 на файлы, т.е. полный доступ только владельцу и чтение для группы и остальных.

Чтобы FTP использовал локальное время сервера, а не GMT установим:

use_localtime=YES

И включим лог загружаемых и скачиваемых файлов:

xferlog_enable=YES

Разрешаем передачу данных через порт 20, требуется для лучшей совместимости с некоторыми клиентами:

connect_from_port_20=YES

Задаем путь к логу и его формат:

xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES

Укажем таймауты:

idle_session_timeout=600
data_connection_timeout=120

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

Для корректной работы с текстовыми данными, в частности с символами переноса строки в разных ОС (CR+LF в Windows, LF в Linux) включим поддержку ASCII, это полезно, если вы скачиваете скрипты или файлы с Linux сервера, правите их в среде Windows и заливаете обратно. В этом случае FTP автоматически будет менять символы переноса строки для соответствия стандартам системы.

ascii_upload_enable=YES
ascii_download_enable=YES

Обязательно изолируем пользователя в корне его домашней директории и рядом впишем опцию, разрешающую запись в корень:

chroot_local_user=YES
allow_writeable_chroot=YES

Остальные опции оставляем без изменения.

Ниже добавим необходимые нам настройки. Разрешим пассивный режим и явно укажем диапазон портов:

pasv_enable=YES
pasv_min_port=62000
pasv_max_port=62999

Включим виртуальных пользователей:

guest_enable=YES

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

guest_username=www-data

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

virtual_use_local_privs=YES

Укажем шаблон для автоматической генерации домашнего каталога виртуального пользователя:

user_sub_token=$USER

Теперь можно задать сами домашние директории

local_root=/var/www/$USER

Также иногда неплохо будет скрыть реальных владельцев содержимого, для этого добавьте:

hide_ids=YES

Если вы используете Ubuntu, то добавьте следующую недокументированную опцию:

seccomp_sandbox=NO

Это позволит избежать ошибки 500 OOPS: prctl PR_SET_SECCOMP failed, которая возникает из некорректной совместной работы vsftpd и системы безопасности seccomp, в Debian данная ошибка не проявляется.

На этом настройка FTP-сервера закончена, сохраняем файл и переходим к настройке правил аутентификации. Откроем /etc/pam.d/vsftpd, закомментируем в нем все строки и добавим две свои:

auth required pam_pwdfile.so pwdfile /etc/vsftpwd
account required pam_permit.so

После этого аутентификация локальных пользователей на FTP-сервере будет невозможна, работать будут только виртуальные. Опция pwdfile /etc/vsftpwd указывает путь к файлу паролей, его нам необходимо будет создать на следующем шаге.

Для создания пользователей будем использовать утилиту htpasswd из состава apache2-utils, для создания файла паролей и первого пользователя введите:

htpasswd -c -d /etc/vsftpwd blue.lab

Ключ -c предписывает создать файл паролей, если он существует, то все данные в нем будут очищены, а файл перезаписан, -d задает необходимый для vsftpd алгоритм шифрования хэша пароля.

Следующие пользователи создаются командой (в нашем примере это пользователь green.lab):

htpasswd -d /etc/vsftpwd green.lab

Для удаления пользователя используйте (удаляем red.lab):

htpasswd -D /etc/vsftpwd red.lab

После чего можно перезапустить службу FTP-сервера и проверить его работу:

service vsftpd restart

Как видим, настроить FTP-сервер с виртуальными пользователями по нашей инструкции (в отличие от многих иных "инструкций" в сети) абсолютно несложно и недолго. Если вы будете внимательно следовать всем нашим рекомендациям, то сложностей у вас возникнуть не должно.

ИСТОЧНИК: